如何在 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 << (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 &
才能使其正常工作,但我必须承认,对于这种情况,它并不是最惯用的。 0xFF &
正在将unsigned char
提升为int
,以便调用std::cout <<
的正确重载方法,该方法接受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
您关于 <<
表现为移位运算符的发现可能是正确的。但在我的示例中,请注意,<<
不是移位运算符。在我的示例中,<<
被std::cout
重载。因此,它不再是移位运算符。我将buf0
提升为int
,以便它命中到接受int
的overload
。否则,它将命中到不同的重载方法。
你完全正确!我将您对“Anding”的想法整合到我的单元测试中,并在评论时忘记了您的示例。你不用轮班!以上是关于如何在 C++ 中将 unsigned char[] 打印为 HEX?的主要内容,如果未能解决你的问题,请参考以下文章
如何在python中将unsigned char类型的int字符串转换为int
如何在 C 中将 short 转换为 unsigned char *buf?
将 System::String^ 转换为 unsigned char*