我有Python代码struct.pack('>I',val)
,其中val
是任意数字,我该如何在C ++中做到这一点。
我知道struct.pack
以无符号int的Big-endian字节顺序返回字节字符串,如果设置为'> I',但是我如何在C ++中做到这一点。
我知道C ++中存在此功能的完整模拟,但是也许我可以用一些C ++代码来做到这一点?谢谢!
最佳答案
根据the documentation,struct.pack('>I',val)
将32位无符号整数转换为big-endian格式的字符串。等效的C ++代码很容易使用位运算符实现,并且通常如下所示:
std::string pack_uint32_be(uint32_t val) {
unsigned char packed[4];
packed[0] = val >> 24;
packed[1] = val >> 16 & 0xff;
packed[2] = val >> 8 & 0xff;
packed[3] = val & 0xff;
return std::string(packed, packed + 4);
}
您可以找到许多在不同字节序之间转换的现有函数,但是在标准C ++中却没有。例如,BSD网络实现附带的
htonl
函数返回一个数字,该数字的内存表示形式是给定值的大端版本。使用htonl
可以将pack_uint32_be
实现为:std::string pack_uint32_be(uint32_t val) {
union {
uint32_t val;
char packed[4];
} be;
be.val = htonl(val);
return std::string(be.packed, be.packed + 4);
}
这两个函数均假定包含
<string>
(对于std::string
)和<cstdint>
(或等效项)(对于uint32_t
)。后一个功能还需要包含arpa/inet.hr
或与Windows等效的htonl
。关于c++ - 做Python的C++代码struct.pack('> I',val),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21180078/