1

我一直在关注显示如何使用 Windows CryptoAPI 对数据进行哈希处理的 msdn 示例。该示例可以在这里找到: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");
}

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

4

2 回答 2

2

x >> 4右移x四位。在和之间x & 0xf进行按位运算。0xf 设置了四个最低有效位,所有其他位都清除。andx0xf

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

四位恰好适合一个十六进制数字,因此每个位都用于在数组中查找一个十六进制数字,大概看起来像这样:

char rgbDigits[] = "0123456789abcdef"; // or possibly upper-case letters
于 2012-07-17T19:50:39.010 回答
1

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

  • “>> 4”表示右移 4 位,这反过来表示“除以 16”
  • "& 0xf" 等于位与运算,意思是“取前 4 位”

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

于 2012-07-17T19:54:10.500 回答