2016-06-16 3 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}입니다. 내가 잘못하고있는 것은 무엇인가? 문안 인사.

추신 : 관심있는 사람들을 위해 zlib 압축에 대한 실제 입력은 {9, 12, 13}입니다.

답변

1

기능이 올바르지 않습니다. 체크섬이 압축 결과가 아닌 원래의 압축되지 않은 데이터에서 실행되어야한다는 것입니다. 기본적으로 {9, 12, 13}에 Adler32()를 실행하면 원하는 결과를 얻을 수있었습니다. 문안 인사.

관련 문제