以十六进制形式打印的无符号字符太长
Printed unsigned chars as hex are too long
让我们假设我有一个非常简单的例子:
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"呢?
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
实时演示
如果在循环中保持char
无符号,则会得到所需的结果:
for (const unsigned char & v: bytes) {
// ^^^^^^^^
cout << hex << setfill('0') << setw(2) << uppercase << static_cast<unsigned>(v) <<" ";
}
auto
或auto&
也可以工作,因为矢量元素是无符号的。
得到FF
s的原因是系统上的char
是有符号的,这意味着值在转换为整数时得到符号扩展。
演示。
正如其他人所说,之所以会发生这种情况,是因为您将元素强制转换为有符号的char。我更喜欢以这种方式使用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]) << " ";
}
使用迭代器也是一个好主意。
相关文章:
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 从 std::vector<无符号字符>切片中提取 int?
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- 库特无符号字符
- 寻找一种更好的方法来表示无符号字符数组
- C++ 无符号字符 *{varName};-> C#
- 如何返回/复制unique_ptr<无符号字符[]>的值?
- 将浮点数转换为无符号字符数组并打印出来
- 在函数中返回无符号字符数组,但不返回指针
- 如何在 C/C++ 中将无符号字符*转换为无符号字符数组?
- 如何返回实际值(在我的例子中是无符号字符数组)而不是来自 C++ 函数的指针?
- 如何将带有十六进制值的 std::string 转换为 std::vector<无符号字符>
- 无符号字符打印其 ASCII 值
- 字符数组到无符号字符 *
- 是否可以在 c++ 中将两位数保存在无符号字符中