printf:以十六进制显示SHA1哈希值

时间:2012-07-17 19:42:51

标签: c++ windows sha1 cryptoapi

我一直在关注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");
}

如果有人能为我解释一下,我将不胜感激,提前谢谢:)

2 个答案:

答案 0 :(得分:2)

x >> 4x右移四位。 x & 0xfandx之间按位0xf进行。 0xf设置了四个最低有效位,所有其他位清零。

假设rgbHash是一个无符号字符数组,这意味着第一个表达式仅保留四个最高有效位,第二个表达式保留(可能)8位输入的四个最低有效位。

四位正好适用于一个十六进制数字,所以每个都用于查找数组中的十六进制数字,大概看起来像这样:

char rgbDigits[] = "0123456789abcdef"; // or possibly upper-case letters

答案 1 :(得分:1)

此代码使用简单的“过滤”技术

  • “&gt;&gt; 4”表示向右移动4个位置,这意味着“除以16”
  • “&amp; 0xf”等于位AND操作,这意味着'先前4位'

这两个值都传递给rgbDigits,它在有效范围内产生了输出 - 人类可读