结构位填充和LSB / MSB歧义C ++

时间:2014-07-11 12:45:23

标签: c++ c struct embedded bit-packing

我必须为以下数据包标题写一个c ++代码:

Original image link, PNG version of the above JPEG.

这是我为上述数据包格式编写的结构代码。我想知道uint8_t或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;

        //-----------------//

        uint8_t MasterChannelFrameCount;
        uint8_t 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保存在struct?

我一直感到困惑,我已经尝试过阅读,但最终让我更加困惑。

PS:我使用的是32位处理器。

3 个答案:

答案 0 :(得分:5)

使用位字段时,具体如何映射位是特定于实现的。所以很难确定你是否做得对,我们需要知道确切的CPU和编译器(当然还有编译器版本)。

总之;不要这样做。对于像这样的事情,位字段不是很有用。

请手动执行,方法是根据需要声明单词并设置其中的位。

答案 1 :(得分:2)

恕我直言,任何试图以这种方式构建struct的人都处于犯罪状态。

例如,C99标准说:

  

实现可以分配足够大的任何可寻址存储单元来保存位域。如果剩余足够的空间,则紧跟在结构中的另一个位字段之后的位字段将被打包到相同单元的相邻位中。如果剩余的空间不足,则是否将不适合的位域放入下一个单元或重叠相邻单元是实现定义的。单元内的位域分配顺序(高阶到低阶或低阶到高阶)是实现定义的。可寻址存储单元的对齐未指定。

即使您可以预测您的编译器会以(例如)uint32_t为单位构造位字段,并且字段排列在第一个字段LS位......您仍然需要使用字节序来处理!

所以...正如放松所说......用手做!

答案 2 :(得分:0)

我同意你不应该这样做。然而,意法半导体使用位域访问其Cortex-M3 / M4微控制器寄存器的位。因此,任何希望其用户能够使用STMicroelectronics Cortex-M3 / M4库的编译器供应商都需要支持从最低有效位开始的位域分配。在我的编译器中,这是默认值,但它也是可选的,所以如果我愿意,我可以反转它。