字节顺序转换C++

sha*_*h17 5 c c++ endianness bitset

我正在尝试将从big-endian机器发送的一些数据解码到解码器,解码器位于little-endian机器上.我没有这么做过,我觉得自己很困惑.

我使用位集来打印我的数据,这样我就可以确切地看到它是如何出现在特定的32位结构中的,我可以看到我需要的数据位于位序列的中间.

现在,我知道如果你有一个32位的值,从大到小,你可以反转字节顺序.如果我这样做,我的数字并没有达到我预期的数字(手工完成).

所以,例如.我有一个32位的unsigned int.我知道它来自我的Big-Endian机器为0x50000000.当我使用little-endian机器上的bitset打印时,cout << "packSpare 32: " << bitset<32>(Data.pack_Spare).to_string() << endl; 我得到0x00005000.所以它看起来更像是按顺序交换前两个字节,依次与后两个字节交换.

我原来有这样的结构:

#pragma pack(push, 1)
    struct PACK_SPARE
    {
        int         Spare3:28;
        int         Heading_Reference:1;
        int         Spare2:1;
        int         H_Valid:1;
        int         Spare5:1;
    };
    #pragma pack(pop)
Run Code Online (Sandbox Code Playgroud)

这是与大端机器发送方式相反的顺序,但是我注意到了一些明显的位交换发生的问题,所以我想把整个东西拉成32位,然后交换,然后打印出来数据.现在我正在使用int pack_Spare;

它只是采用两个16位块,并交换那些,而不是在整个32位值上进行交换?对不起,如果这没有意义,就像我说的那样,我有点困惑.

编辑 此数据不是通过网络传输的.我正在从视频文件中流式传输比特.我将此数据存储到其相应的值中.所以我想我的问题是,如果我有一个32位的int,然后将数据传入该变量,如果我使用bitset,为什么它交换我的32位int的两个16位分组,而不是按字节进行?我期待0x50000000,但我得到0x00005000(0000和5000被交换,而不是我期望的典型的字节序交换,这正在颠倒所有字节的顺序).

小智 5

只是使用hton()和合作.用于在网络和本机机器字节顺序之间进行转换,然后应用实数位算术运算,例如移位和屏蔽.您不需要立即访问内存.


ryy*_*ker 2

虽然我不经常推荐维基百科来进行除了介绍之外的任何内容,但我确实在这里找到了很好的字节序讨论,(回答你的问题为什么它交换我的 32 位 int 的两个 16 位分组,而不是按字节进行?)。

讨论发生在该链接页面的 2/3 左右...查找以下内容:

在此输入图像描述

在同一页面上有一些关于字节序的有趣的事情。