Struct Bit Packing и LSB/MSB неоднозначность С++

Мне пришлось написать код c++ для следующего заголовка пакета:

Исходная ссылка на изображение, PNG-версия вышеуказанного JPEG.

Вот код структуры, который я написал для вышеуказанного формата пакета. Я хочу знать, правильно ли совпадают поля бит ******* или uint16_t

struct TelemetryTransferFramePrimaryHeader { //-- 6 Ocets Long --// //-- Master Channel ID (2 octets)--// uint16_t TransferFrameVersionNumber : 2; uint16_t SpacecraftID : 10; uint16_t VirtualChannelID : 3; uint16_t OCFFlag : 1; //-----------------// ******* MasterChannelFrameCount; ******* VirtualChannelFrameCount; //-- Transfer Frame Data Field Status (2 octets) --// uint16_t TransferFrameSecondaryHeaderFlag : 1; uint16_t SyncFlag : 1; uint16_t PacketOrderFlag : 1; uint16_t SegmentLengthID : 2; uint16_t FirstHeaderPointer : 11; //-----------------// };

Как я могу гарантировать, что LSB → MSB сохраняется в структуре?

Я все время смущаюсь, и я пробовал читать, но это еще больше запутывает меня.

PS: Я использую 32-битный процессор.

3 ответа

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

Вкратце; не делайте этого. Бит-поля не очень удобны для таких вещей.

Делайте это вручную вместо этого, объявляя слова по мере необходимости и устанавливая биты внутри них.


ИМХО любой, кто пытается построить struct таким образом, находится в состоянии греха.

Стандарт C99, например, гласит:

Реализация может выделять любой адресный блок хранения, достаточно большой для хранения битового поля. Если остается достаточно места, бит-поле, которое сразу следует за другим битовым полем в структуре, должно быть упаковано в соседние биты того же блока. Если недостаточно места, то будет ли бит-поле, которое не подходит, помещается в следующий блок или перекрывает смежные единицы, определяется реализацией. Порядок распределения бит-полей внутри единицы (от высокого порядка до младшего или низкого порядка) определяется реализацией. Выравнивание адресного блока хранения не указывается.

Даже если вы могли бы предсказать, что ваш компилятор будет строить бит-поля в единицах (скажем) ********, а поля были выстроены первым битом LS поля... у вас все еще есть сущность, с которой нужно справиться!

Итак... как расслабляется говорит... делай это вручную!


Я согласен, что вы не должны этого делать. Однако STMicroelectronics использует битовые поля для доступа к битам своих регистров микроконтроллера Cortex-M3/M4. Таким образом, любой поставщик компилятора, который хочет, чтобы его пользователи могли использовать библиотеки STMicroelectronics Cortex-M3/M4, должны поддерживать распределение битовых полей, начиная с младшего значащего бита. В моем компиляторе это значение по умолчанию, но оно также необязательно, поэтому я мог бы отменить его, если захочу.

licensed under cc by-sa 3.0 with attribution.