2016-06-16 6 views
0

In meinem .NET-Code muss ich einen 4-Byte-Adler-32-Wert als Trailer zu meinen komprimierten zlib-Daten hinzufügen (RFC 1950). Hier ist meine C# Funktion:Adler-32-Ausgabe stimmt nicht mit den erwarteten Werten überein

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

Und hier ist, wie ich meine vier Bytes bin immer:

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

Das Problem ist, von der Prüfung einer tatsächlichen zlib-komprimierte Daten, die erwarteten Bytes sein sollen {0, 67, 0, 35}, aber die Werte, die ich bekomme, sind {10, 177, 2, 174}. Was mache ich falsch? Grüße.

PS: Für diejenigen, die interessiert sind, ist die tatsächliche Eingabe für zlib-Komprimierung {9, 12, 13}.

Antwort

1

Es stellte sich heraus, dass die Funktion korrekt war. Es ist nur so, dass die Prüfsumme auf den ursprünglichen unkomprimierten Daten und nicht auf dem Ergebnis der Komprimierung ausgeführt werden muss. Im Grunde gab mir das Ausführen von Adler32() auf {9, 12, 13} das gewünschte Ergebnis. Grüße.

Verwandte Themen