执行Python struct.pack('> I',val)的C ++代码

时间:2014-01-17 07:22:01

标签: c++ endianness

我有Python代码struct.pack('>I',val),其中val是任意数字,我怎么能用C ++做这件事。

我知道struct.pack在unsigned int中以Big-endian字节顺序返回字节字符串,如果设置为'> I',但我在C ++中是如何做到的。

我理解这个函数的完全模拟剂存在于C ++中,但也许我可以用一些C ++代码来做到这一点?谢谢!

1 个答案:

答案 0 :(得分:1)

根据the documentationstruct.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。