C++中字节数组元素如何以十六进制数值形式打印(Windows 10 64位环境)
实现十六进制字节数值输出的方法
问题本质
C++标准库的输出流对char、unsigned char类型做了专门的输出重载,不管是否提前设置std::hex格式,只要传入的是char类类型的变量,都会优先按照对应ASCII字符输出内容。0x43对应的ASCII字符就是'C',因此程序运行时不会输出十六进制数值形式的43。
可落地的实现方案
- 触发数值输出重载:将
unsigned char强转为int类型后再输出,这是跨平台兼容的通用写法,在64位Windows 10环境下可以直接正常运行
替换原有输出行的代码为:
如果需要输出大写字母的十六进制值(比如0x0F输出为std::cout << std::hex << static_cast<int>(bytes[0]) << std::endl;0F而非0f),可以在输出前加上std::uppercase格式控制。 - 补全两位十六进制宽度:处理字节流时经常需要给不足两位的十六进制值补前导零(比如0x0F不能只输出
f,要输出0f),可以借助已经引入的<iomanip>头文件里的工具函数实现,示例:// 遍历输出数组中所有字节的格式化十六进制值 for (unsigned char b : bytes) { std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(b) << " "; } // 实际输出效果:43 4d 30 30 0f 0d
常见踩坑提醒
std::hex是流的持久化格式状态,设置一次后,后续所有数值输出都会沿用十六进制规则,如果后续程序需要输出十进制数值,记得用std::dec切回十进制格式。- 不要使用转成void*指针的方式输出字节值,这种写法会输出指针地址的十六进制编码,和字节本身的数值没有关系,得不到正确结果。
内容的提问来源于stack exchange,提问作者Vinod
相关产品推荐
相关产品推荐

