it-swarm.com.de

Wie sieht ein zlib-Header aus?

In meinem Projekt muss ich wissen, wie ein zlib-Header aussieht. Ich habe gehört, es ist ziemlich einfach, aber ich kann keine Beschreibung des Zlib-Headers finden.

Enthält es beispielsweise eine magische Zahl?

50
unixman83

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 Komprimierungsmethode "deflate" mit einer Fenstergröße von bis zu 32K. Dies ist die von gzip und PNG verwendete Methode und fast alles andere. CM = 15 ist reserviert.

CINFO (Informationen zur Komprimierung) Bei CM = 8 ist CINFO der Logarithmus zur Basis-2 des LZ77-Fensters Größe minus acht (CINFO = 7 zeigt eine 32K-Fenstergröße). Werte Von CINFO über 7 sind in dieser Version der Spezifikation nicht zulässig. CINFO ist in dieser Spezifikation nicht definiert fürCM ungleich 8.

In der Praxis bedeutet dies, dass das erste Byte fast immer 78 (hex) ist.

FLG (FLaGs) Dieses Flag-Byte ist wie folgt aufgeteilt:

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 bei Betrachtung als Eine vorzeichenlose 16-Bit-Ganzzahl, die in MSB-Reihenfolge (CMF * 256 + FLG) gespeichert ist, Ein Vielfaches von 31 ist.

FLEVEL (Komprimierungsgrad) Diese Flags können von bestimmten Kompressionsmethoden (_) verwendet werden. Die "deflate" -Methode (CM = 8) setzt diese Flags als Folgt:

        0 - compressor used fastest algorithm
        1 - compressor used fast algorithm
        2 - compressor used default algorithm
        3 - compressor used maximum compression, slowest algorithm
64
0xbadc0de

zlib Magic Header

78 01 - No Compression/low
78 9C - Default Compression
78 DA - Best Compression 
88
VahidN

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 wird FLG.FDICT (Dictionary-Flag) nicht gesetzt. In solchen Fällen ist die DICTID einfach nicht vorhanden. Die Gesamtsumme beträgt also nur 2 Bytes.

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

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

Mehr unter ZLIB RFC

13
mk..

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

11
Cttr

Der ZLIB-Header (wie in RFC195 definiert) ist ein 16-Bit-Big-Endian-Wert. Es enthält die folgenden Felder von der höchsten bis zur niedrigsten Signifikanz:

  • CINFO (Bits 12-15)
    Gibt die Fenstergröße als Zweierpotenz von 0 (256 Byte) bis 7 (32768 Byte) an. Dies ist normalerweise 7. Höhere Werte sind nicht erlaubt.

  • CM (Bits 8-11)
    Die Komprimierungsmethode. Es ist nur "Entleeren" (8) Zulässig.

  • FLEVEL (Bits 6-7)
    Zeigt grob die Komprimierungsstufe an, von 0 (Schnell/niedrig) bis 3 (Langsam/hoch)

  • FDICT (Bit 5)
    Zeigt 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 ohne Rest 31 dividiert.

Normalerweise können nur die Felder CINFO und FLEVEL frei geändert werden, und FCHECK muss basierend auf dem Endwert berechnet werden was die anderen Felder enthalten, so sind insgesamt 32 mögliche Header gültig. 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 CINFO -Feld wird von Komprimierern selten oder nie auf einen anderen Wert als 7 Gesetzt (was das maximale 32 KB-Fenster angibt). Daher sind die einzigen Werte, die Sie in der Praxis wahrscheinlich sehen, die vier in der unteren Reihe (beginnend mit 78).

* (Sie fragen sich vielleicht, ob der Wert von FCHECK einen kleinen Spielraum aufweist - kann er auf 0 oder 31 gesetzt werden, wenn beide die Prüfsumme bestehen? In der Praxis gibt es jedoch keine gültigen Header Wo diese Situation auftritt, müssen wir uns keine Sorgen machen.)

2
mwfearnley

Alle Antworten hier sind höchstwahrscheinlich korrekt. Wenn Sie jedoch den ZLib-Komprimierungsstrom direkt bearbeiten möchten, wurde er mit gz_open, gzwrite, gzclose-Funktionen erstellt. Dann gibt es einen zusätzlichen 10-Byte-Header, bevor die Zlib-Komprimierung Steam kommt - 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);

Das Ergebnis ist folgender Hex-Dump: 1F 8B 08 00 00 00 00 00 00 0B, Gefolgt vom zlib-Komprimierungsstream.

Es gibt aber auch 8 Byte nachgestellt - sie sind uLong - crc über die gesamte Datei, uLong - unkomprimierte Dateigröße - suchen Sie am Ende des Streams nach folgenden Bytes:

    putLong (s->file, s->crc);
    putLong (s->file, (uLong)(s->in & 0xffffffff));
0
TarmoPikaro