2017-01-18 7 views
0

を使用している理由は、私はC#でAdler32チェックアルゴリズムを実装する方法を見つけたと私はそれを使用したいと思いますが、私は、コードの一部を理解していない:Adler32チェックサム生成 - ビットと右のオペレータをシフトが

誰かが私に説明できます:

1)なぜSUM2がシフトしている理由SUM1、およびSUM2が

2)を初期化するとき、ビット演算子が使用されていますか? wikiに

Adler32チェックhttps://en.wikipedia.org/wiki/Adler-32

&オペレータの説明: (バイナリとオペレータコピーし、両方のオペランドに存在する場合、結果のビット)

private bool MakeForBuffer(byte[] bytesBuff, uint adlerCheckSum) 
    { 
     if (Object.Equals(bytesBuff, null)) 
     { 
      checksumValue = 0; 
      return false; 
     } 
     int nSize = bytesBuff.GetLength(0); 
     if (nSize == 0) 
     { 
      checksumValue = 0; 
      return false; 
     } 
     uint sum1 = adlerCheckSum & 0xFFFF; // 1) why bit operator is used? 
     uint sum2 = (adlerCheckSum >> 16) & 0xFFFF; // 2) why bit operator is used? , why is it shifted? 

     for (int i = 0; i < nSize; i++) 
     { 
      sum1 = (sum1 + bytesBuff[i]) % adlerBase; 
      sum2 = (sum1 + sum2) % adlerBase; 
     } 
     checksumValue = (sum2 << 16) + sum1; 
     return true; 
    } 

答えて

3

1)なぜビット演算子は使用されますか?

& 0xFFFF

のでsum1が単にチェックサムの下位16ビットであり、0にチェックサムの二つの高バイトを設定します。

2)ビット演算子はなぜ使用されますか?なぜシフトされたのですか?

adlerCheckSum >> 16、下位16バイトまでの上位16のバイトをシフト& 0xFFFF最初のステップと同様の処理を行い - それは0

adlerChecksum = 0x12345678 

adlerChecksum & 0xFFFF = 0x00005678 

adlerChecksum >> 16 = 0x????1234 
に16個の高ビットをセット

(これはC#では0x000でなければなりませんが、他の言語/コンパイラでは "ビットを囲み" 0x56781234となります)

(adlerChecksum >> 16) & 0xFFFF = 0x000これは0x1234であることがわかりましたが、この手順はC#ではおそらく不要な予防策です。合わせ

adlerChecksum = 0x12345678 
sum1 =   0x00005678 
sum2 =   0x000

これら二つの動作は、単純に2 UInt16UInt32チェックサムを分割します。 Adler32チェックタグ-ウィキから


アドラー-32は、減圧の結果を検証するためにZLIBで使用される高速チェックサムアルゴリズムです。これは、65521を法とする2つの和で構成されています。まず、s1 = 1とs2 = 0で始まり、各バイトxに対して、s1 = s1 + x、s2 = s2 + s1です。 2つの合計は、下位16ビットのs1と上位16ビットのs2の32ビット値に結合されます。

関連する問題