gpt4 book ai didi

python - 将int打包成一个字符串

转载 作者:行者123 更新时间:2023-11-30 02:33:25 26 4
gpt4 key购买 nike

我正在尝试将此序列从 Python 转换为 C++。

bytesString = struct.pack('!l', value)

如何使用字节移位将整数值打包到 std::string 中?

最佳答案

易于维护的方法(不是字节序不可知的)

将基本类型的值“编码”为字节序列的典型方法是使用简单的std::copy:

#include <string>
#include <iostream>
#include <iomanip>

template <typename T>
std::string pack(const T val)
{
std::string bytes(sizeof(T), '\0');
std::copy(
reinterpret_cast<const char*>(&val),
reinterpret_cast<const char*>(&val) + sizeof(T),
bytes.begin()
);
return bytes;
}

int main()
{
int x = 42;
std::string bytes{pack(x)};

std::cout << std::noshowbase << std::hex << std::setfill('0');
for (auto c : bytes)
std::cout << "0x" << std::setw(2) << +c << ' ';

// ^ may need tweaking for values above 127; not sure
}

// On my little-endian system with 32-bit int:
// "0x2a 0x00 0x00 0x00"

( live demo )

可能要求 C++11 是严格的,因为 std::string 在此之前不是正式连续的。我显然在 main 中使用了 C++11 语法,但可以对其进行微不足道的更改。


易于维护的方法(网络字节序)

如果您希望结果始终采用网络字节顺序(这与您的 Python 表达式中 ! 的使用相匹配),您可以首先应用 htonl:

std::string bytes{pack(htonl(x))};

(简单地reinterpret_cast 整个值(而不是复制)的解决方案具有潜在的对齐和别名问题。)


最优方法(网络字节序)

如果您的代码处于紧密循环中并且您不希望字节顺序转换拷贝,那么您可以考虑轮类循环:

#include <string>
#include <climits>
#include <iostream>
#include <iomanip>

template <typename T>
std::string pack_in_network_order(const T val)
{
const size_t NBYTES = sizeof(T);
std::string bytes(NBYTES, '\0');

for (size_t i = 0; i < NBYTES; i++)
bytes[NBYTES - 1 - i] = (val >> (i * CHAR_BIT)) & 0xFF;

return bytes;
}

int main()
{
int x = 42;
std::string bytes{pack_in_network_order(x)};

std::cout << std::noshowbase << std::hex << std::setfill('0');
for (auto c : bytes)
std::cout << "0x" << std::setw(2) << +c << ' ';
}

// On my system with 32-bit int:
// "0x00 0x00 0x00 0x2a"

( live demo )

(我使用 CHAR_BIT 来实现可移植性,但将 0xFF 硬编码为值掩码。您需要修复它。)

关于python - 将int打包成一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35482008/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com