Adler-32校验和生成-为什么使用位和右移运算符



我已经找到了在C#中实现Adler32算法的方法,我想使用它,但我不理解部分代码:

有人能解释一下吗:

1)为什么在初始化sum1和sum2时使用位运算符

2)为什么sum2被移动

维基上的Adler32https://en.wikipedia.org/wiki/Adler-32

&操作员说明:(如果两个操作数中都存在位,则二进制AND运算符将位复制到结果)

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;
}

1)为什么使用位运算符?

& 0xFFFF将校验和的两个高字节设置为0,因此sum1只是校验和的低16位。

2)为什么使用位运算符,为什么会发生变化?

adlerCheckSum >> 16将16个较高的字节下移到较低的16个字节,& 0xFFFF执行与第一步相同的操作-将16个高位设置为0。

示例

adlerChecksum = 0x12345678
adlerChecksum & 0xFFFF = 0x00005678
adlerChecksum >> 16 = 0x????1234

(它应该是C#中的0x00001234,但其他语言/编译器"将位包裹起来",你会得到0x56781234)

(adlerChecksum >> 16) & 0xFFFF=0x00001234现在您可以确定它是0x1234,这一步骤只是C#中可能不必要的预防措施。

adlerChecksum = 0x12345678
sum1 =          0x00005678
sum2 =          0x00001234

这两个操作的组合只是将UInt32校验和拆分为两个UInt16


来自adler32标签Wiki:

Adler-32是zlib中用于验证解压缩结果的快速校验和算法。它由模65521的两个和组成。从s1=1和s2=0开始,然后对于每个字节x,s1=s1+x,s2=s2+s1。这两个和被组合成32位值,s1在低16位,s2在高16位。

最新更新