我一直在关注msdn示例,该示例演示了如何使用Windows CryptoAPI散列数据。可以在此处找到示例:http://msdn.microsoft.com/en-us/library/windows/desktop/aa382380%28v=vs.85%29.aspx
我修改了代码以使用SHA1算法。
我不明白在hexadecmial中显示哈希(如下所示)的代码如何工作,更具体地说,我不明白>> 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");
}
如果有人能为我解释一下,我将不胜感激,提前谢谢:)
答案 0 :(得分:2)
x >> 4
将x
右移四位。 x & 0xf
在and
和x
之间按位0xf
进行。 0xf设置了四个最低有效位,所有其他位清零。
假设rgbHash
是一个无符号字符数组,这意味着第一个表达式仅保留四个最高有效位,第二个表达式保留(可能)8位输入的四个最低有效位。
四位正好适用于一个十六进制数字,所以每个都用于查找数组中的十六进制数字,大概看起来像这样:
char rgbDigits[] = "0123456789abcdef"; // or possibly upper-case letters
答案 1 :(得分:1)
此代码使用简单的“过滤”技术
这两个值都传递给rgbDigits,它在有效范围内产生了输出 - 人类可读