2016-06-16 8 views
0

.NETコードで、zlib圧縮データ(RFC 1950)に4バイトのAdler-32値をトレーラとして追加する必要があります。私は4バイトで取得していますかAdler-32出力が期待値と一致しません

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

そして、ここにある:ここに私のC#関数である実際にzlib圧縮データを調べるから、

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

問題があるが、期待されるバイトをすることになっています{0、67、0、35}しかし、私が得ている値は{10,177,2,174}です。私が間違っていることは何ですか?よろしく。

PS:実際のzlib圧縮への入力は{9,12,13}です。

答えて

1

機能が正しいことが分かります。チェックサムは圧縮の結果ではなく元の圧縮されていないデータで実行する必要があります。基本的に、Adler32()を{9,12,13}で実行すると、私には望ましい結果が得られました。よろしく。

関連する問題