我正在尝试解码从大端机器发送到驻留在小端机器上的解码器的一些数据。我没有太多的工作,我觉得我自己很困惑。
我使用 bitsets 来打印我的数据,这样我就可以准确地看到它是如何针对特定的 32 位结构输出的,而且我可以看到我需要的数据位于位序列的中间。
现在,我知道如果你有一个 32 位值,要从大到小,你需要颠倒字节顺序。如果我这样做,我的数字不会以我期望的方式结束(手工完成)。
所以,例如。我有一个 32 位无符号整数。我知道它来 self 的 Big-Endian 机器 0x50000000。当我使用 little-endian 机器上的位集打印时 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)
这与它从大端机器发送的顺序相反,但我注意到一些明显的位交换发生了问题,所以我想把整个东西拉成 32 位,然后交换,然后打印数据。现在我正在使用 int pack_Spare;
它只是获取两个 16 位 block 并交换它们,而不是对整个 32 位值进行交换吗?抱歉,如果这没有意义,就像我说的,我有点困惑。
编辑 此数据不是通过网络传输的。我正在从视频文件中流式传输位。我将此数据存储到其相应的值中。所以我想我的问题是,如果我有一个 32 位 int,然后将数据读入该变量,如果我使用 bitset,为什么它交换 32 位 int 的两个 16 位分组,而不是按字节进行?我期待 0x50000000,但我得到 0x00005000(0000 和 5000 被交换,而不是我所期望的典型字节序交换,这是颠倒所有字节的顺序)。
最佳答案
只需使用 hton()
和 co。为了在网络字节序和 native 字节序之间进行转换,然后应用真正的按位算术运算,例如移位和屏蔽。您无需为即时内存访问而烦恼。
关于c++ - 字节顺序转换 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19598771/