如何在C++中将unsigned char[]打印为十六进制?

15
我想打印以下哈希数据。我应该怎么做?
unsigned char hashedChars[32];
SHA256((const unsigned char*)data.c_str(),
       data.length(), 
       hashedChars);
printf("hashedChars: %X\n", hashedChars);  // doesn't seem to work??
3个回答

18

十六进制格式说明符需要单个整数值,但您提供的是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;

3
@vidit用户以“printf”的方式提出问题,因此我决定以同样的方式回答。他们显然对“printf”如何工作有些困惑,我想澄清这一点。 - JaredPar
6
printf 在 C++ 中也是有效的!有时我会使用它来代替流,因为它有其适用的场合。 - aardvarkk
1
@JaredPar 所以.. printf 对我来说实际上是有效的,但是 cout 对我来说不起作用。 我正在使用 xCode,并且“hashedChars:”被打印出来了,但其余部分没有。 - louis.luo
3
你需要确保每个“char”都输出2个数字,否则输出结果会缺少一些零。对于printf,更改格式为“%02X”,对于cout不确定如何操作。 - Mark Ransom
7
对我而言,必须将 hashedChars[i] 强制转换为 unsigned int,即 hex << (unsigned int)hashedChars[i] 才能使它对我有效。 - Tomislav Nakic-Alfirevic
显示剩余7条评论

4

In 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 &'的含义吗? - محمد جعفر نعمة
1
虽然需要使用 0xFF& 才能使其正常工作,但我必须承认对于这种情况来说它并不是最惯用的。0xFF&unsigned char 提升为 int,以便调用 std::cout << 的适当重载方法,该方法接受一个 int。您也可以像这样做:1 + buf0 [i] - 1,它仍然有效。或者一些奇怪的方式,例如 +buf0 [i]。或者通过明显的强制转换 int(buf0 [i])。有必要将 buf0 [i] 提升为 int - daparic
非常感谢。确实,在您的回复之后,我尝试更深入地了解了cout功能。似乎转换与移位运算符有关,而不是cout本身。有关更多信息,请参见此链接https://dev59.com/11YN5IYBdhLWcg3wb3sX。 bool的移位返回一个int。作为证明:bool b = true; bool d =(b << 2); printf(d?"1 \ n":“0 \ n”); - محمد جعفر نعمة
关于<<作为移位运算符的发现可能是正确的。但在我的例子中,请注意,<<不是一个移位运算符。在我的例子中,<<std::cout重载了。因此,它不再是一个移位运算符。我将buf0提升为int,以便它可以命中接受intoverload。否则,它将会命中到另一个重载方法。 - daparic
你是完全正确的!我已经将你的“Anding”的想法整合到我的单元测试中,并在注释时忘记了你的示例。你没有使用移位操作! - محمد جعفر نعمة

0

如评论中所述,您需要将unsigned char强制转换为整数(intunsigned int,因为您使用正值),并且您需要在可能打印1个字符而不是2个字符的值处添加一些零:

cout << "hashedChars: ";
for (int i = 0; i < 32; i++) {
  cout << std::hex << std::setfill('0') 
       << std::setw(2) << static_cast<int>(hashedChars[i]);
}
cout << endl;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接