Adler-32输出与预期值

时间:2016-06-16 19:43:53

标签: .net compression zlib

在我的.NET代码中,我需要在我的zlib压缩数据(RFC 1950)中添加一个4字节的Adler-32值作为预告片。这是我的C#函数:

    private static readonly uint Modulus = 65521;
    public static int Adler32(byte[] data, int offset, int length) {
        uint a = 1, b = 0;
        for (int counter = 0; counter < length; ++counter) {
            a = (a + (data[offset + counter])) % Modulus;
            b = (b + a) % Modulus;
        }
        return unchecked((int)((b << 16) + a));
    }

以下是我获取四个字节的方法:

    byte[] data = { 227, 228, 225, 5, 0 }; // compressed data
    int adler32 = Adler32(data, 0, data.Length);

    byte b1 = (byte)((adler32 >> 24) & 0xFF);
    byte b2 = (byte)((adler32 >> 16) & 0xFF);
    byte b3 = (byte)((adler32 >> 8) & 0xFF);
    byte b4 = (byte)((adler32 >> 0) & 0xFF);

问题是,通过检查实际的zlib压缩数据,预期的字节应该是{0,67,0,35},但我得到的值是{10,177,2,174}。我做错了什么?问候。

PS:对于那些感兴趣的人,zlib压缩的实际输入是{9,12,13}。

1 个答案:

答案 0 :(得分:1)

原来这个功能是对的。只是校验和必须在原始未压缩数据上运行,而不是在压缩结果上运行。基本上,在{9,12,13}上运行Adler32()给了我想要的结果。问候。