1

Windows CryptoAPI を使用してデータをハッシュする方法を示す msdn の例に従っています。例はここにあります: http://msdn.microsoft.com/en-us/library/windows/desktop/aa382380%28v=vs.85%29.aspx

SHA1 アルゴリズムを使用するようにコードを変更しました。

ハッシュ (以下に示す) を 16 進数で表示するコードがどのように機能するのか理解できません。具体的には、>> 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 >> 4x右に4ビットシフトします。との間でx & 0xfビット単位で実行します。0xfには最下位4ビットが設定されており、他のすべてのビットはクリアされています。andx0xf

unsigned rgbHashcharの配列であるとすると、これは、最初の式が(おそらく)8ビット入力の最上位4ビットのみを保持し、2番目の式が最下位4ビットを保持することを意味します。

4ビットは正確に1つの16進数に収まるものであるため、これらの各ビットは、おそらく次のような配列で16進数を検索するために使用されます。

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

このコードは、単純なビットの「フィルタリング」手法を使用しています

  • 「>>4」は、右に4桁シフトすることを意味します。つまり、「16で除算する」ことを意味します。
  • 「&0xf」はビットAND演算に等しく、「最初の4ビットを取る」ことを意味します

これらの値は両方ともrgbDigitsに渡され、有効な範囲で出力が生成されます-人間が読める形式

于 2012-07-17T19:54:10.500 に答える