C++中如何让十六进制字符串保留中间的前导零?
解决UUID字节向量转带短横线十六进制字符串时前导零丢失的问题
问题出在std::setw(2)的作用范围上——它只对紧接着的下一个输出操作生效。你把它写在循环外面,只有第一个字节的输出会应用2位宽度限制,后续的字节输出时这个约束已经失效,导致前导零被省略。
修正后的代码如下:
#include <iomanip> #include <iostream> std::ostream& operator<<(std::ostream &os, const Id &id) { std::ios oldState(nullptr); oldState.copyfmt(os); os << std::hex << std::uppercase << std::setfill('0'); for (int i = 0; i < 16; i++) { // 每次输出字节前都设置宽度为2,确保单字节值补前导零 os << std::setw(2) << static_cast<unsigned int>(id.id_[i]); if (i == 3 || i == 5 || i == 7 || i == 9) os << '-'; } os.copyfmt(oldState); return os; }
额外注意两个细节:
- 把
(int)强制转换改成static_cast<unsigned int>:如果你的id_[i]是有符号char类型,当字节值大于127时会被解析为负数,转成unsigned int可以避免这个问题,保证十六进制输出正确。 std::setfill('0')是持久化的格式设置,只要不修改就会一直生效,所以放在循环外面即可,无需重复设置。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

