【问题标题】:Convert hex 0xAABBCC to string "AA:BB:CC" using sprintf使用 sprintf 将十六进制 0xAABBCC 转换为字符串“AA:BB:CC”
【发布时间】:2018-10-19 15:00:05
【问题描述】:

我有一个十六进制数 0xaabbcc,我想将其转换为 AA:BB:CC 的 char 字符串。

使用sprintf(myStr, %X, 0xaabbcc); 得到char myStr[] = "AABBCC";

是否可以使用sprintf 或其他函数将0xaabbcc 转换和格式化为AA:BB:CC

【问题讨论】:

  • 您必须编写自己的函数来执行您想要的格式。是的,该函数可以使用printf()
  • 您所要求的不能在一次操作中完成。将数字存储为整数,然后将其分解为单独的字节,并以十六进制打印每个字节,每个字节之间带有:
  • 您好,感谢您的回复。我将使用一个额外的函数来添加“:”标记字符。我不确定我是否错过了使用 sprintf 的一些东西。将在这里为感兴趣的人发布我的解决方案。

标签: c++ printf hexdump


【解决方案1】:

您需要用引号将说明符字符串括起来。 printf family 接收 const char* 作为格式字符串。 %x 单独在字符串之外意味着以 x 为模,如果在 % 之前没有整数,则会导致编译器错误,就像你的情况一样

之后只需拆分您要打印的字节

unsigned v = 0xAABBCCU;
sprintf(myStr, "%02X:%02X:%02X", v >> 16, (v >> 8) & 0xFFU, v & 0xFFU); // or
sprintf(myStr, "%02X:%02X:%02X", v >> 16, (uint8_t)(v >> 8), (uint8_t)v);

但是,由于您使用的是 C++,因此使用 std::string 会更安全

std::stringstream myStr;
myStr << std::hex << std::setfill('0')
      << std::setw(2) << (v >> 16)
      << std::setw(2) << ((v >> 8) & 0xFFU)
      << std::setw(2) << (v & 0xFFU)

【讨论】:

    【解决方案2】:

    如果您想坚持使用 printf 并且您正在使用 GCC(或者可能是 Clang,但我找不到任何文档记录),那么您可以使用 printf cusomization

    坦率地说,@phuclv 的答案可能更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-26
      • 2018-01-31
      • 2018-01-22
      • 1970-01-01
      • 2013-02-07
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多