2017-01-18 48 views
0

我已經找到方法,它實現的Adler32算法在C#中,我想使用它,但我不明白的部分代碼:Adler32校驗生成 - 爲什麼位和右移運算符被用來

有人可以解釋我:

1)爲什麼時候爲什麼SUM2轉移SUM1,SUM2和初始化

2)位的操作使用?

對維基

的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設置兩個高字節校驗和爲0,所以sum1僅僅是校驗和的低16位。

2)爲什麼使用位運算符? ,它爲什麼轉移?

adlerCheckSum >> 16將這個16個字節更高向下到較低的16個字節,& 0xFFFF不相同如在第一步驟 - 它設置16個高位爲0

adlerChecksum = 0x12345678 

adlerChecksum & 0xFFFF = 0x00005678 

adlerChecksum >> 16 = 0x????1234 

(它應該是在C#中,但其他語言/編譯器「環繞位」 0x000,你會得到0x56781234

(adlerChecksum >> 16) & 0xFFFF = 0x000現在您可以確定它是0x1234,這一步只是C#中可能不需要的一項預防措施。

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

這兩個操作結合簡單地拆分UInt32校驗分成兩個UInt16


從標籤的Adler32-維基:

阿德勒-32是在zlib的用於驗證解壓縮的結果的快速校驗和算法。它由兩個和模65521組成。以s1 = 1和s2 = 0開始,然後對於每個字節x,s1 = s1 + x,s2 = s2 + s1。這兩個和被組合成一個32位值,s1在低16位和s2在高16位。