Die ZLib-Dekomprimierung schlägt bei einem Large-Byte-Array fehl

8

Beim Experimentieren mit der ZLib-Komprimierung bin ich auf ein seltsames Problem gestoßen. Das Dekomprimieren eines zlib-komprimierten Bytearrays mit zufälligen Daten schlägt reproduzierbar fehl, wenn das Quellarray mindestens 32752 Byte lang ist. Hier ist ein kleines Programm, das das Problem reproduziert, Sie können es in Aktion auf IDEOne sehen . Die Komprimierungs- und Dekomprimierungsmethoden sind standardmäßige Code-Lernprogramme.

%Vor%

Ist das ein bekannter Fehler in ZLib? Oder habe ich einen Fehler in meinen Komprimieren / Dekomprimieren-Routinen?

    
Sean Patrick Floyd 31.05.2017, 11:53
quelle

2 Antworten

4

Es ist ein Fehler in der Logik der Komprimierungs- / Dekomprimierungsmethoden; Ich bin nicht so tief in den Implementierungen, aber mit dem Debugging fand ich folgendes:

Wenn der Puffer von 32752 Bytes komprimiert ist, gibt die Methode deflater.deflate() den Wert 32767 zurück. Dies ist die Größe, auf die Sie den Puffer in der Zeile initialisiert haben:

%Vor%

Wenn Sie die Puffergröße beispielsweise auf

erhöhen %Vor%

Sie werden sehen, dass die Eingabe von 32752 Bytes tatsächlich zu 32768 Bytes deflationiert ist. In Ihrem Code enthalten die komprimierten Daten nicht alle Daten, die darin enthalten sein sollten.

Wenn Sie dann versuchen, zu dekomprimieren, gibt die inflater.inflate() -Methode null zurück, was anzeigt, dass mehr Eingabedaten benötigt werden. Aber da Sie nur nach inflater.finished() suchen, enden Sie in einer Endlosschleife.

Sie können entweder die Puffergröße beim Komprimieren erhöhen, aber das bedeutet wahrscheinlich nur, dass Sie das Problem mit größeren Dateien haben, oder Sie müssen die Logik zum Komprimieren / Dekomprimieren neu schreiben, um Ihre Daten in Blöcken zu verarbeiten.

    
P.J.Meisch 31.05.2017, 13:03
quelle
4

Anscheinend war die compress () Methode fehlerhaft. Dieser funktioniert:

%Vor%     
Sean Patrick Floyd 31.05.2017 13:01
quelle

Tags und Links