2017-01-18 29 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位。