c++ - 结构位打包和 LSB/MSB 歧义 C++

标签 c++ c struct embedded bit-packing

我必须为以下数据包 header 编写 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 保留在结构中?

我一直感到困惑,我已经尝试阅读,但结果却让我更加困惑。

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

最佳答案

使用位字段时位的确切映射方式是特定于实现的。因此很难确定您是否做对了,我们需要知道确切的 CPU 和编译器(当然还有编译器版本)。

简而言之;不要这样做。位域对于这样的事情不是很有用。

改为手动执行,根据需要声明单词并设置其中的位。

关于c++ - 结构位打包和 LSB/MSB 歧义 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24698096/

相关文章:

c++ - 如何存储对函数的引用,以便稍后在 node.js C++ 插件模块中调用它?

c - 与左节点比较后删除节点

c - C 中的变量乘法?

C 编程结构体运行时错误

c - C 中的链表包含结构体

c++ - 何时需要 c++17 std::apply/invoke 进行编程?

c++ - _O_WTEXT、_O_U16TEXT、_O_U8TEXT - 这些模式在 mingw 编译器中是否可行,是否有任何解决方法?

c++ - 在多个线程/函数之间使用shared_ptr-IDS Peak API

c - 完美平衡二叉搜索树

C++ 神秘结构赋值与 int 截断