In meinem Projekt muss ich wissen, wie ein zlib
Header aussieht. Ich habe gehört, dass es ziemlich einfach ist, aber ich kann keine Beschreibung des zlib-Headers finden.
Enthält es zum Beispiel eine magische Zahl?
0 1
+---+---+
|CMF|FLG|
+---+---+
CMF (Komprimierungsmethode und Flags) Dieses Byte ist je nach Komprimierungsmethode in eine 4-Bit-Komprimierungsmethode und ein 4-Bit-Informationsfeld unterteilt.
bits 0 to 3 CM Compression method
bits 4 to 7 CINFO Compression info
CM (Komprimierungsmethode) Gibt die in der Datei verwendete Komprimierungsmethode an. CM = 8
bezeichnet die "Deflate" -Komprimierungsmethode mit einer Fenstergröße von bis zu 32 KB. Dies ist die Methode von gzip und PNG und fast allem anderen.
CM = 15 ist reserviert.
CINFO (Komprimierungsinfo) Für CM = 8 ist CINFO der Basis-2-Logarithmus der LZ77-Fenstergröße minus acht (CINFO = 7 gibt eine Fenstergröße von 32 KB an). Werte von CINFO über 7 sind in dieser Version der Spezifikation nicht zulässig. CINFO ist in dieser Spezifikation für CM ungleich 8 nicht definiert.
In der Praxis bedeutet dies, dass das erste Byte fast immer 78
(hex) ist.
FLG (FLaGs) Dieses Flag-Byte ist wie folgt unterteilt:
bits 0 to 4 FCHECK (check bits for CMF and FLG)
bit 5 FDICT (preset dictionary)
bits 6 to 7 FLEVEL (compression level)
Der FCHECK-Wert muss so sein, dass CMF und FLG, wenn sie als vorzeichenlose 16-Bit-Ganzzahl in MSB-Reihenfolge (CMF * 256 + FLG) betrachtet werden, ein Vielfaches von 31 sind.
FLEVEL (Komprimierungsstufe) Diese Flags können von bestimmten Komprimierungsmethoden verwendet werden. Die "deflate" -Methode ( CM = 8
) setzt diese Flags wie folgt:
0 - compressor used fastest algorithm
1 - compressor used fast algorithm
2 - compressor used default algorithm
3 - compressor used maximum compression, slowest algorithm
zlib magische Überschriften
quelle
ZLIB / GZIP-Header
Deflate hat keine gemeinsamen Header
quelle
Es folgt das komprimierte Zlib-Datenformat.
Meistens ist
FLG.FDICT
(Dictionary-Flag) nicht gesetzt. In solchen FällenDICTID
ist das einfach nicht vorhanden. Das gesamte Hören beträgt also nur 2 Bytes.Die Header-Werte (
CMF
undFLG
) ohne Wörterbuch sind wie folgt definiert.Mehr bei ZLIB RFC
quelle
Der ZLIB-Header (wie in RFC1950 definiert ) ist ein 16-Bit-Big-Endian-Wert. Es enthält diese Felder von höchst bis niedrigstwertig:
CINFO
(Bits 12-15)Gibt die Fenstergröße als Zweierpotenz von
0
(256 Byte) bis7
(32768 Byte) an. Dies wird normalerweise sein7
. Höhere Werte sind nicht erlaubt.CM
(Bits 8-11)Die Komprimierungsmethode. Nur Deflate (
8
) ist erlaubt.FLEVEL
(Bits 6-7)Zeigt ungefähr die Komprimierungsstufe von
0
(schnell / niedrig) bis3
(langsam / hoch) an.FDICT
(Bit 5)Gibt an, ob ein voreingestelltes Wörterbuch verwendet wird. Dies ist normalerweise
0
.1
ist technisch erlaubt, aber ich kenne keine Deflate-Formate, die voreingestellte Wörterbücher definieren.FCHECK
(Bits 0-4)Eine Prüfsumme (5 Bits,
0
..31
), deren Wert so berechnet wird, dass der gesamte Wert 31 ohne Rest teilt.Typischerweise wird nur das
CINFO
undFLEVEL
können Felder frei verändert werden undFCHECK
muss auf der Grundlage der Endwert berechnet werden. * Kein voreingestelltes Wörterbuch Unter der Annahme, gibt es keine Wahl in dem, was die anderen Felder enthalten, also insgesamt 32 möglichen Header gültig sind. Hier sind sie:Das
CINFO
Feld wird von Kompressoren selten, wenn überhaupt, auf etwas anderes als7
(unter Angabe des maximalen 32-KB-Fensters) festgelegt. Die einzigen Werte, die Sie wahrscheinlich in freier Wildbahn sehen, sind die vier in der unteren Zeile (beginnend mit78
).* (Sie fragen sich vielleicht, ob der Wert von
FCHECK
- ein kleiner Spielraum ist - könnte er auf 0 oder 31 gesetzt werden, wenn beide die Prüfsumme bestehen? In der Praxis gibt es jedoch keine gültigen Header, in denen diese Situation auftritt wir müssen uns keine Sorgen machen.)quelle
Alle Antworten hier sind jedoch höchstwahrscheinlich richtig. Wenn Sie den ZLib-Komprimierungsstrom direkt bearbeiten möchten und er mithilfe von
gz_open, gzwrite, gzclose
Funktionen erstellt wurde, gibt es einen zusätzlichen Header mit 10 führenden Bytes, bevor der zlib-Komprimierungsdampf kommt. Diese werden von der Funktion gz_open erstellt. Header sieht so aus:Dies führt zu folgendem Hex-Dump:
1F 8B 08 00 00 00 00 00 00 0B
gefolgt von einem zlib-Komprimierungsstrom.Es gibt aber auch
uLong
nachfolgende 8 Bytes - sie sind - crc über die gesamte Datei,uLong
- unkomprimierte Dateigröße - suchen Sie nach folgenden Bytes am Ende des Streams:quelle