Пропущенные байты между данными при распределении значений - PullRequest
0 голосов
/ 05 августа 2020

У меня есть пакет данных, и когда я назначаю эти данные переменным бит за битом в соответствии с требованиями, между ними не хватает нескольких байтов. Не знаю почему? Я работаю в C ++.

Например, у меня есть структура типа:

struct __attribute__((packed))
{
    uint32  varA:9;
    uint32  varB:10;
    uint32  varC:9;
    uint32  varD:4;
    uint16  varE:16;
    uint32  varF:32;
}structA;

И у меня есть данные как: a0 1a 0d 00 01 42 00 1 c 17 2d

Все идет хорошо до переменной varD. Когда доходит до varE, он должен присвоить ему 01 42, но в нем отсутствует 01 и используется только 42. И после этого все идет нормально.

И если я делаю это вот так

 struct __attribute__((packed))
{
    uint32  varA:9;
    uint32  varB:10;
    uint32  varC:9;
    uint32  varD:4;
    uint8   varE:8;
    uint8   varF:8;
    uint32  varG:32;
}structA;

Назначение битов работает нормально. Есть идеи, почему это происходит?

Ответы [ 3 ]

1 голос
/ 06 августа 2020

Компилятор MinGW основан на компиляторе G CC.

На G CC при ориентации на платформы x86 используется только

__attribute__((__packed__))

работает со структурами с

__attribute__((gcc_struct)).

Однако при ориентации на платформы Microsoft Windows атрибут по умолчанию для структур

__attribute__((ms_struct)).

Таким образом, я вижу три способа sh того, что вы хотите:

  1. Используйте параметр командной строки компилятора -mno-ms-bitfields, чтобы для всех структур по умолчанию __attribute__((gcc_struct)).
  2. Явно используйте __attribute__((gcc_struct)) в своей структуре.
  3. Используйте #pragma pack вместо __attribute__((__packed__)).

Примечание: этот ответ почти идентичен моему ответу на этот аналогичный вопрос . Поэтому, возможно, будет уместным пометить один из вопросов как дублирующий. С другой стороны, ситуация в вопросе в этой цепочке может немного отличаться, потому что в другой цепочке вопросов битовые поля не использовались.

0 голосов
/ 06 августа 2020

Я получил решение, как сказал @StephenDuffy, мне не хватает директивы pragma. После добавления этого код у меня работает нормально.

директива pragma выглядит так: - # pragma pack (pu sh, 1)

и завершение ее как: - # pragma pack (pop)

0 голосов
/ 05 августа 2020

Проблема, которую вы видите, скорее всего, связана с заполнением. Внутри структур поля могут быть разнесены друг с другом, чтобы выровняться по смещению 2, 4 или 8 байтов, например: может быть выложен так:

| Boundary 1        | Boundary 2        | Boundary 3
+----+----+----+----+----+----+----+----+----+----+----+----+----+
|  0 |  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |  9 | 10 | 11 | 12 | Memory
|----+----+----+----+----+----+----+----+----+----+----+----+----|
|      Field A      | Field B | PADDING |        Field C         | Struct Layout
+----+----+----+----+----+----+----+----+----+----+----+----+----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...