问题 如何在C ++中将无符号char []打印为HEX?


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

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

1386
2018-05-04 15:09


起源



答案:


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

15
2018-05-04 15:11



@vidit用户提出的问题 printf 所以我决定回答这个问题。他们显然对如何产生了一些混淆 printf 工作,我想清除它 - JaredPar
printf 也是有效的C ++!有时我使用它而不是流。它有它的位置。 - aardvarkk
@JaredPar所以...... printf 实际上对我有用,但是 cout 对我不起作用。我在用 xCode 并且“hashedChars:”得到印刷,但其余部分没有印刷。 - louis.luo
您需要确保为每个输出2位数字 char,否则你会从输出中遗漏一些零。对于printf,将格式更改为 %02X,不知道如何为cout做这件事。 - Mark Ransom
FWIW,不得不施展 unsigned int,即 hex << (unsigned int)hashedChars[i] 让它为我工作。 - Tomislav Nakic-Alfirevic


答案:


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

15
2018-05-04 15:11



@vidit用户提出的问题 printf 所以我决定回答这个问题。他们显然对如何产生了一些混淆 printf 工作,我想清除它 - JaredPar
printf 也是有效的C ++!有时我使用它而不是流。它有它的位置。 - aardvarkk
@JaredPar所以...... printf 实际上对我有用,但是 cout 对我不起作用。我在用 xCode 并且“hashedChars:”得到印刷,但其余部分没有印刷。 - louis.luo
您需要确保为每个输出2位数字 char,否则你会从输出中遗漏一些零。对于printf,将格式更改为 %02X,不知道如何为cout做这件事。 - Mark Ransom
FWIW,不得不施展 unsigned int,即 hex << (unsigned int)hashedChars[i] 让它为我工作。 - Tomislav Nakic-Alfirevic