我有Python代码struct.pack('>I',val)
,其中val
是任意数字,我怎么能用C ++做这件事。
我知道struct.pack
在unsigned int中以Big-endian字节顺序返回字节字符串,如果设置为'> I',但我在C ++中是如何做到的。
我理解这个函数的完全模拟剂存在于C ++中,但也许我可以用一些C ++代码来做到这一点?谢谢!
答案 0 :(得分:1)
根据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
函数返回一个数字,其内存中表示是给定值的big-endian版本。使用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
。后一个函数还需要包含htonl
或其等效于{{1}}的Windows。