Wie sieht ein zlib-Header aus?

70

In meinem Projekt muss ich wissen, wie ein zlibHeader 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?

unixman83
quelle

Antworten:

82

Link zu RFC

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
0xbadc0de
quelle
Das ist eine großartige Antwort :), hat mir in vielerlei Hinsicht geholfen ... hey! schöner Avatar
Ryan
108

zlib magische Überschriften

78 01 - No Compression/low
78 9C - Default Compression
78 DA - Best Compression 
VahidN
quelle
Dies half mir herauszufinden, mit welcher Art von Komprimierung ich es zu tun hatte. Ich wusste, dass die Datei komprimiert war, suchte aber nach einigen Header-Bytes und dies kam auf. Vielen Dank!
ProVega
4
Bei Verwendung des Java Inflator (verwendet ZLIB) werden Header-Werte von 120, -100 angezeigt. Dies entspricht 78 9C. Sichert, was Sie oben gesagt haben.
Dan
24

ZLIB / GZIP-Header

Level | ZLIB  | GZIP 
  1   | 78 01 | 1F 8B 
  2   | 78 5E | 1F 8B 
  3   | 78 5E | 1F 8B 
  4   | 78 5E | 1F 8B 
  5   | 78 5E | 1F 8B 
  6   | 78 9C | 1F 8B 
  7   | 78 DA | 1F 8B 
  8   | 78 DA | 1F 8B 
  9   | 78 DA | 1F 8B 

Deflate hat keine gemeinsamen Header

Cttr
quelle
16

Es folgt das komprimierte Zlib-Datenformat.

 +---+---+
 |CMF|FLG| (2 bytes - Defines the compression mode - More details below)
 +---+---+
 +---+---+---+---+
 |     DICTID    | (4 bytes. Present only when FLG.FDICT is set.) - Mostly not set
 +---+---+---+---+
 +=====================+
 |...compressed data...| (variable size of data)
 +=====================+
 +---+---+---+---+
 |     ADLER32   |  (4 bytes of checksum)
 +---+---+---+---+

Meistens ist FLG.FDICT(Dictionary-Flag) nicht gesetzt. In solchen Fällen DICTIDist das einfach nicht vorhanden. Das gesamte Hören beträgt also nur 2 Bytes.

Die Header-Werte ( CMFund FLG) ohne Wörterbuch sind wie folgt definiert.

 CMF |  FLG
0x78 | 0x01 - No Compression/low
0x78 | 0x9C - Default Compression
0x78 | 0xDA - Best Compression 

Mehr bei ZLIB RFC

mk ..
quelle
6

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) bis 7(32768 Byte) an. Dies wird normalerweise sein 7. 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) bis 3(langsam / hoch) an.

  • FDICT (Bit 5)
    Gibt an, ob ein voreingestelltes Wörterbuch verwendet wird. Dies ist normalerweise 0. 1ist 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 CINFOund FLEVELkönnen Felder frei verändert werden und FCHECKmuss 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:

      FLEVEL: 0       1       2       3
CINFO:
     0      08 1D   08 5B   08 99   08 D7
     1      18 19   18 57   18 95   18 D3
     2      28 15   28 53   28 91   28 CF
     3      38 11   38 4F   38 8D   38 CB
     4      48 0D   48 4B   48 89   48 C7
     5      58 09   58 47   58 85   58 C3
     6      68 05   68 43   68 81   68 DE
     7      78 01   78 5E   78 9C   78 DA

Das CINFOFeld wird von Kompressoren selten, wenn überhaupt, auf etwas anderes als 7(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 mit 78).

* (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.)

mwfearnley
quelle
4

Alle Antworten hier sind jedoch höchstwahrscheinlich richtig. Wenn Sie den ZLib-Komprimierungsstrom direkt bearbeiten möchten und er mithilfe von gz_open, gzwrite, gzcloseFunktionen 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:

    fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1],
         Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE);

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 uLongnachfolgende 8 Bytes - sie sind - crc über die gesamte Datei, uLong- unkomprimierte Dateigröße - suchen Sie nach folgenden Bytes am Ende des Streams:

    putLong (s->file, s->crc);
    putLong (s->file, (uLong)(s->in & 0xffffffff));
TarmoPikaro
quelle
Alles wird hier erklärt: tools.ietf.org/html/rfc1952
Vouze