我有Python代码struct.pack('>I',val),其中val是任意数字,我该如何在C ++中做到这一点。

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

我知道C ++中存在此功能的完整模拟,但是也许我可以用一些C ++代码来做到这一点?谢谢!

最佳答案

根据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函数返回一个数字,该数字的内存表示形式是给定值的大端版本。使用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/

10-12 22:22