让我们假设我有一个非常简单的例子:
vector<unsigned char> bytes {0xFF, 0xFF, 0xFD};
for (const char & v: bytes) {
cout << hex << setfill('0') << setw(2) << uppercase << static_cast<unsigned>(v) <<" ";
}
cout << endl;
这给出了:
FFFFFFFF FFFFFFFF FFFFFFFD
但是,我希望简短,例如:
FF FF FD
那么为什么我会得到一些额外的“FFFFF”?
答案 0 :(得分:3)
如果您在循环中保持char
无符号,则会得到所需的结果:
for (const unsigned char & v: bytes) {
// ^^^^^^^^
cout << hex << setfill('0') << setw(2) << uppercase << static_cast<unsigned>(v) <<" ";
}
auto
或auto&
也可以使用,因为向量元素是无符号的。
您获得FF
的原因是系统上的char
已签名,这意味着这些值会在转换为整数时进行符号扩展。
答案 1 :(得分:3)
for (const char & v: bytes)
您隐式将bytes
中的每个元素转换为char
,在您的平台上似乎是signed
。然后,当您转向unsigned
时,char
会进行符号扩展,最终会出现大的十六进制值。
将以上内容更改为以下
之一for (const unsigned char & v: bytes)
for (auto const& v: bytes)
for (auto v: bytes) // since it's only a char copying might be better
答案 2 :(得分:0)
正如其他人所说,这是因为您将元素转换为已签名的字符。我更喜欢以这种方式使用for循环来防止这样的错误:
vector<unsigned char> bytes{ 0xFF, 0xFF, 0xFD };
for (int i = 0; i < bytes.size(); i++) {
cout << hex << setfill('0') << setw(2) << uppercase << static_cast<unsigned>(bytes[i]) << " ";
}
使用迭代器也是一个好主意。