我(C++新手)我目前正在努力实现以下功能:C++:序列化字节数组十六进制字符串
std::string bytes_to_hex(const std::string &bytes);
功能应该基本上返回给定的字节数组的base16编码:
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();
}
使用此功能,outpu t是:
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
我的问题是:
- 为什么第二个版本和冷杉st不?这里的主要区别是什么?
- 第二个版本是否正确执行我的初衷还是会出现其他问题吗?
'+'什么都不做,但是做了你想要的东西,也就是确保字节被解释为正数 –
请记住'char'类型可以是'signed' *或*'unsigned',它是up编辑器。在你的情况下,它们似乎是'signed',这意味着当字符[升级为'int'](http://en.cppreference.com/w/c/language/conversion#Integer_promotions)时,它们也是*符号扩展*。 –
@PasserBy角色的一元'+'力[*整数升级*](http://en.cppreference.com/w/c/language/conversion#Integer_promotions)。 –