我一直在关注 msdn 示例,该示例演示了如何使用 Windows CryptoAPI 对数据进行哈希处理。该示例可以在这里找到:http://msdn.microsoft.com/en-us/library/windows/desktop/aa382380%28v=vs.85%29.aspx
我已修改代码以使用 SHA1 算法。
我不明白以十六进制显示哈希值(如下所示)的代码是如何工作的,更具体地说,我不明白 >> 4 运算符和 & 0xf 运算符的作用。
if (CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0)){
printf("MD5 hash of file %s is: ", filename);
for (DWORD i = 0; i < cbHash; i++)
{
printf("%c%c", rgbDigits[rgbHash[i] >> 4],
rgbDigits[rgbHash[i] & 0xf]);
}
printf("\n");
}
如果有人能为我解释一下,我将不胜感激,提前致谢:)
最佳答案
x >> 4
将 x
右移四位。 x & 0xf
在 x
和 0xf
之间执行按位 and
。 0xf 设置了四个最低有效位,并清除所有其他位。
假设 rgbHash 是一个无符号字符数组,这意味着第一个表达式仅保留 8 位输入的四个最高有效位,第二个表达式保留(大概)8 位输入的四个最低有效位。
四位正好适合一个十六进制数字,因此其中每一位都用于在数组中查找十六进制数字,该数组大概如下所示:
char rgbDigits[] = "0123456789abcdef"; // or possibly upper-case letters
关于c++ - 打印: Displaying an SHA1 hash in hexadecimal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11529744/