如何在 C++ 中将 unsigned char[] 打印为 HEX?

Posted

技术标签:

【中文标题】如何在 C++ 中将 unsigned char[] 打印为 HEX?【英文标题】:How to print unsigned char[] as HEX in C++? 【发布时间】:2012-05-14 03:43:42 【问题描述】:

我想打印以下散列数据。我该怎么做?

unsigned char hashedChars[32];
SHA256((const unsigned char*)data.c_str(),
       data.length(), 
       hashedChars);
printf("hashedChars: %X\n", hashedChars);  // doesn't seem to work??

【问题讨论】:

【参考方案1】:

十六进制格式说明符需要一个整数值,但您提供的是 char 数组。您需要做的是将char 值单独打印为十六进制值。

printf("hashedChars: ");
for (int i = 0; i < 32; i++) 
  printf("%x", hashedChars[i]);

printf("\n");

由于您使用的是 C++,尽管您应该考虑使用 cout 而不是 printf(这对于 C++ 来说更惯用。

cout << "hashedChars: ";
for (int i = 0; i < 32; i++) 
  cout << hex << hashedChars[i];

cout << endl;

【讨论】:

@vidit 用户以printf 的形式提出问题,所以我决定以这种方式回答。他们显然对printf 的工作原理有些困惑,我想澄清一下 printf 也是有效的 C++!有时我使用它而不是流。它有它的位置。 @JaredPar So.. printf 实际上对我有用,但 cout 对我不起作用。我正在使用 xCode 和 "hashedChars:" 已打印,但其余部分没有。 您需要确保为每个 char 输出 2 位数字,否则您将在输出中丢失一些零。对于 printf 将格式更改为%02X,不确定如何为 cout 执行此操作。 FWIW,必须转换为 unsigned int,即 hex &lt;&lt; (unsigned int)hashedChars[i] 才能让它为我工作。【参考方案2】:

在 C++ 中

#include <iostream>
#include <iomanip>

unsigned char buf0[] = 4, 85, 250, 206;
for (int i = 0;i < sizeof buf0 / sizeof buf0[0]; i++) 
    std::cout << std::setfill('0') 
              << std::setw(2) 
              << std::uppercase 
              << std::hex << (0xFF & buf0[i]) << " ";

【讨论】:

你能解释一下'0xFF &'吗? 虽然需要0xFF &amp; 才能使其正常工作,但我必须承认,对于这种情况,它并不是最惯用的。 0xFF &amp; 正在将unsigned char 提升为int,以便调用std::cout &lt;&lt; 的正确重载方法,该方法接受int。你也可以这样做,1 + buf0[i] - 1,它仍然有效。或者一些深奥的手段,比如+buf0[i]。或者简单地通过明显的铸造int(buf0[i])。有必要将buf0[i] 推广为int 非常感谢。确实,在您回复之后,我试图更深入地了解 cout 功能。似乎转换与移位运算符有关,而不是 cout。有关更多信息,请参阅此***.com/questions/47439616/…。 bool 的移位返回一个 int。作为证明: bool b = true;布尔 d = (b 您关于 &lt;&lt; 表现为移位运算符的发现可能是正确的。但在我的示例中,请注意,&lt;&lt; 不是移位运算符。在我的示例中,&lt;&lt;std::cout 重载。因此,它不再是移位运算符。我将buf0 提升为int,以便它命中到接受intoverload。否则,它将命中到不同的重载方法。 你完全正确!我将您对“Anding”的想法整合到我的单元测试中,并在评论时忘记了您的示例。你不用轮班!

以上是关于如何在 C++ 中将 unsigned char[] 打印为 HEX?的主要内容,如果未能解决你的问题,请参考以下文章

C++中将对象this转换成unsigned char指针

如何在python中将unsigned char类型的int字符串转换为int

如何在 C 中将 short 转换为 unsigned char *buf?

将 System::String^ 转换为 unsigned char*

c++中定义一个buff为unsigned char 型,如何初始化全为0

如何使用多次 memcpy 转换回 std::vector<unsigned char>?