2012-10-31 6 views
5

Ich denke, es gibt einen Weg, dies zu tun, aber ich bin mir nicht sicher, wie? Im Grunde schrieb ich ein Komprimierungsprogramm, das zu einem CRC-Fehler führte, als ich versuchte, die komprimierten Daten zu entpacken. Normalerweise bedeutet dies, dass der Dekompressor tatsächlich meine Daten als im richtigen Format erkannt und dekomprimiert hat, aber wenn er das Ergebnis mit der erwarteten Länge verglichen hat, wie von der CRC angegeben, waren sie nicht die gleichen.Force Gzip zu dekomprimieren trotz CRC-Fehler

Aus Vergleichsgründen möchte ich jedoch die Ausgabe sehen, um zu sehen, ob es nur ein Verkettungsproblem ist (was relativ offensichtlich sein sollte, wenn die dekomprimierte Ausgabe nicht Kauderwelsch sondern nur in der falschen Reihenfolge ist).

Antwort

0

Soweit mir bekannt ist, ist die CRC-Prüfung Teil des GZIP-Wrappers, nicht Teil der eigentlichen komprimierten Daten im DEFLATE-Format.

So sollten Sie buchstäblich nur die Bytes nehmen können, die der komprimierte Datenstrom sind, den GZIP-Header und den CRC am Ende ignorierend, und es durch einen Inflater übergeben.

Mit anderen Worten, Sie müssen nur die Bytes nehmen, die denen entsprechen, die als "komprimierte Blöcke" in GZIP File format specification bezeichnet werden, und versuchen, mit einem Java-Inflator-Objekt zu dekomprimieren. Ein bisschen Arbeit, aber möglicherweise weniger als die Neukompilierung des GZIP-Codes, wie Greg es vorschlägt (obwohl seine Option auch prinzipiell funktionieren würde).

8

Sie sagten "entpacken", aber die Frage sagt "gzip". Welches ist es? Das sind zwei verschiedene Programme, die in zwei verschiedenen Formaten arbeiten. Ich werde gzip übernehmen. Auch die Länge wird nicht "von der CRC angegeben". Der gzip-Trailer enthält eine CRC und eine unkomprimierte Länge (modulo 2), die zwei verschiedene Dinge sind.

Der Befehl gzip dekomprimiert alle gültigen Deflate-Daten und schreibt sie aus, bevor der CRC überprüft wird. Wenn also zum Beispiel nehme ich eine .gz Datei und korrupte nur die crc (oder Länge) am Ende, und zu tun:

gzip -dc <corrupt.gz> result 

dann wird führen der gesamten, korrekter unkomprimierter Datenstrom. Es ist nicht notwendig, gzip zu modifizieren und neu zu kompilieren, noch einen eigenen ungzipper zu schreiben. gzip wird sich über den crc beschweren, aber alle Daten werden trotzdem geschrieben.