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在评论中指出的文章似乎提供了一个解决方案.
对于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位值中,将其移位并进行转换.我会写一些好的测试.我怀疑这是一种不常见的情况,更多细节会有所帮助.
| 归档时间: |
|
| 查看次数: |
1297 次 |
| 最近记录: |