在c ++中处理字节序

ewo*_*wok 3 c++ python endianness

我正在努力将系统从python转换为c ++.我需要能够在c ++中执行通常使用Python执行的操作struct.unpack(将二进制字符串解释为数值).对于整数值,我可以使用以下数据类型来实现(某种程度)工作stdint.h:

struct.unpack("i", str) ==> *(int32_t*) str; //str is a char* containing the data
Run Code Online (Sandbox Code Playgroud)

这适用于little-endian二进制字符串,但在big-endian二进制字符串上失败.基本上,我需要>在struct.unpack中使用标签的等价物:

struct.unpack(">i", str) ==> ???
Run Code Online (Sandbox Code Playgroud)

请注意,如果有更好的方法,我会全力以赴.但是,我不能使用c ++ 11,也不能使用除Boost之外的任何第三方库.我还需要能够解释浮点数和双打数,就像在struct.unpack(">f", str)和中一样struct.unpack(">d", str),但是当我解决这个问题时我会谈到它.

注意我应该指出,在这种情况下,我的机器的字节顺序是无关紧要的.我知道我在代码中收到的比特流总是大端的,这就是为什么我需要一个始终涵盖大端案例的解决方案.BoBTFish在评论中指出的文章似乎提供了一个解决方案.

Pau*_*bel 7

对于32位和16位值:

这正是您对网络数据的问题,这是大端的.您可以使用ntohl将32位转换为主机顺序,在您的情况下为little-endian.

ntohl()函数将无符号整数netlong从网络字节顺序转换为主机字节顺序.

int res = ntohl(*((int32_t) str)));
Run Code Online (Sandbox Code Playgroud)

这还将处理您的主机是big-endian并且不会执行任何操作的情况.

对于64位值

在linux/BSD上非标准你可以看看C++中的64位ntohl()吗?,这指向htobe64

这些函数将整数值的字节编码从当前CPU("主机")使用的字节顺序转换为little-endian和big-endian字节顺序.

对于Windows,请尝试:如何在C++中的big-endian和little-endian值之间进行转换?

其中指向_byteswap_uint64以及16位和32位解决方案以及特定于gcc的__builtin_bswap(32/64)调用.

其他尺寸

大多数系统的值不是16/32/64位长.此时我可能会尝试将其存储在64位值中,将其移位并进行转换.我会写一些好的测试.我怀疑这是一种不常见的情况,更多细节会有所帮助.