Размер структуры, содержащей битовые поля, определенные для разных типов - PullRequest
1 голос
/ 24 октября 2019

У меня есть структура, которая содержит битовые поля с разными размерами. Некоторые из битовых полей являются только 1-битными, а некоторые - 32-битными. Я заполню эту структуру буфером, полученным от последовательной связи. Поэтому я планировал определить их в битовых полях, а затем использовать memcpy для заполнения буфера полученным пакетом.

Это мое определение структуры:

#pragma pack(push,1)
typedef struct{

    uint32_t    variable1;          //32 bit
    uint16_t    variable2:16;       //16 bit
    uint32_t    variable3:18;       //18 bit
    uint32_t    variable4:10;       //10 bit
    uint32_t    variable5:4;        //4 bit
    uint8_t     variable6;          //8 bit
    uint8_t     variable7:7;        //7 bit
    uint8_t     variable8:1;        //1 bit
    uint8_t     variable9:6;        //6 bit
    uint8_t     variable10:6;       //6 bit
    uint8_t     variable11:7;       //7 bit
    uint8_t     variable12:5;       //5 bit

}error_driver_t;            //Total length should be 15 bytes (120 bit)
#pragma pack(pop)

printf("\r\nSize of error_driver_t: %d\r\n\r\n", sizeof(demoErrorDriver));    //Expected 15, Resulted 20

Последовательный пакет составляет 15 байтов, поэтомуЯ ожидаю, что эта структура будет иметь длину 15 байт, чтобы правильно использовать memcpy. Но когда я получаю sizeof(error_driver_t), я получаю 20.

Я запутался в том, как использовать битовые поля, когда у меня есть и маленькие, и большие типы в одной и той же структуре.

1 Ответ

1 голос
/ 24 октября 2019

Вы не можете быть уверены, что структура будет иметь точное значение sizeof, равное сумме размера переменных, содержащихся в ней. На это влияют многие факторы, в том числе struct padding, какой пакет прагмы вы используете, какой компилятор вы используете и даже в каком порядке ваши переменные находятся в struct, как указано в этом ответе на аналогичный вопрос.

В дополнение к этому стандарт C говорит, что:

Несколько смежных битовых полей обычно упаковываются вместе (хотя это поведение определяется реализацией)

Таким образом, вы не можете быть уверены, что две разные переменные будут занимать ровно сумму их битовых полей.

В общем, лучше всего было бы использовать несколько битовых масок и / или битовых сдвигов для получения значений. вам нужно из пакета.

...