gpt4 book ai didi

C++:将字节数组序列化为十六进制字符串

转载 作者:行者123 更新时间:2023-11-30 05:08:28 27 4
gpt4 key购买 nike

我(C++新手)目前正在尝试实现以下功能:

std::string bytes_to_hex(const std::string &bytes);

该函数基本上应该返回给定字节数组的 ba​​se16 编码:

std::string input{0xde, 0xad, 0xbe, 0xef} => "deadbeef"

我的第一个版本并没有像我想象的那样工作:

std::string bytes_to_hex(const std::string &bytes) {
std::ostringstream ss;
ss << std::hex;

for (auto &c : bytes) {
ss << std::setfill('0') << std::setw(2) << +c;
}

return ss.str();
}

使用这个函数的输出是:

ffffffdeffffffadffffffbeffffffef

经过一些实验,我发现这个版本看起来更好:

std::string bytes_to_hex(const std::string &bytes) {
std::ostringstream ss;
ss << std::hex;

for (const char &c : bytes) {
ss << std::setfill('0') << std::setw(2) << +(static_cast<uint8_t>(c));
}

return ss.str();
}

输出符合预期:

deadbeef

我的问题是:

  • 为什么第二个版本有效而​​第一个无效?这里的主要区别是什么?
  • 第二个版本是否正确实现了我的初衷,还是会出现其他问题?

最佳答案

正如我在评论中提到的,一元 + 强制 integer promotion .当发生这种情况时,签名类型将符号扩展,这对于 two's complement编码整数意味着负数(最左边的位是 1)用二进制数向左填充(即 0xde 变成 0xffffffde) .

还提到 char 可以是 signed unsigned,这取决于编译器。由于您得到的输出,我们可以说在您的情况下 char 实际上是 signed char

您发现的简单解决方案是首先将字符转换为 unsigned char,然后(使用一元 +)将其提升为 int.

关于C++:将字节数组序列化为十六进制字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46824283/

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