【问题标题】:Adler-32 checksum generating - why bit and shift right operator are usedAdler-32 校验和生成 - 为什么使用位和右移运算符
【发布时间】:2017-06-02 14:48:47
【问题描述】:

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

谁能解释一下:

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

2) 为什么 sum2 会移位?

维基上的 Adler32 https://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;
    }

【问题讨论】:

    标签: c# adler32


    【解决方案1】:

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

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

    2) 为什么使用位运算符? ,为什么会偏移?

    adlerCheckSum &gt;&gt; 16 将高 16 个字节向下移动到低 16 个字节,&amp; 0xFFFF 与第一步相同 - 它将 16 个高位设置为 0。

    示例

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

    (在 C# 中应该是 0x00001234,但其他语言/编译器“将这些位包装起来”,你会得到 0x56781234

    (adlerChecksum &gt;&gt; 16) &amp; 0xFFFF = 0x00001234 现在你可以确定它是0x1234,这一步只是一个预防措施,在 C# 中可能不需要。

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

    这两个操作结合起来只是将UInt32校验和分成两个UInt16


    来自 adler32 Tag-Wiki:

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

    【讨论】:

      猜你喜欢
      • 2016-02-28
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 2014-08-31
      • 2011-04-19
      • 1970-01-01
      • 2014-08-22
      相关资源
      最近更新 更多