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

C# Adler-32校验和生成-为什么使用位和右移运算符,c#,adler32,C#,Adler32,我找到了在C#中实现Adler32算法的方法,我想使用它,但我不理解部分代码: 谁能给我解释一下: 1) 初始化sum1和sum2时为什么使用位运算符 2) 为什么sum2会移位? 维基上的Adler32 &操作员说明: (如果两个操作数中都存在位,则二进制AND运算符将其复制到结果) private bool MakeForBuffer(字节[]bytesBuff,uint adlerCheckSum) { if(Object.Equals(bytesBuff,null)) { checksu

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

谁能给我解释一下:

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

2) 为什么sum2会移位?

维基上的Adler32

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

private bool MakeForBuffer(字节[]bytesBuff,uint adlerCheckSum)
{
if(Object.Equals(bytesBuff,null))
{
checksumValue=0;
返回false;
}
int nSize=bytesBuff.GetLength(0);
如果(nSize==0)
{
checksumValue=0;
返回false;
}
uint sum1=adlerCheckSum&0xFFFF;//1)为什么使用位运算符?
uint sum2=(adlerCheckSum>>16)&0xFFFF;//2)为什么使用位运算符?为什么移位?
对于(int i=0;i
&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中可能不必要

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


从adler32标记Wiki:

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

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中可能不必要

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


从adler32标记Wiki:

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

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