You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 01:13:24