2012-01-29 15 views
41

W moim projekcie muszę wiedzieć, jak wygląda nagłówek zlib. Słyszałem, że jest to dość proste, ale nie mogę znaleźć żadnego opisu nagłówka zlib.Jak wygląda nagłówek zlib?

Czy na przykład zawiera magiczną liczbę?

Odpowiedz

52

Link to RFC

0 1 
+---+---+ 
|CMF|FLG| 
+---+---+ 

CMF (metoda kompresji i flag) Ten bajt zostaje podzielony na metody kompresji 4-bitowy i 4-bitowe pole informacji w zależności od sposobu prasowania.

bits 0 to 3 CM  Compression method 
bits 4 to 7 CINFO Compression info 

cm (metoda kompresji) ten wskazuje metodę kompresji stosowane w pliku. CM = 8 oznacza metodę kompresji "deflate" o rozmiarze okna od do 32K. Jest to metoda używana przez gzip i PNG i prawie wszystko inne. CM = 15 jest zarezerwowane.

CINFO (informacje kompresji) Na cm = 8, CINFO jest baza-2 logarytm okno wielkości LZ77 minus ośmiu (CINFO = 7 oznacza 32K wielkość okna). Wartości z CINFO powyżej 7 są niedozwolone w tej wersji specyfikacji . CINFO nie jest zdefiniowany w tym opisie CM nierówna 8.

W praktyce oznacza to, że pierwszy bajt jest prawie zawsze 78 (Hex)

FLG (flagi) Flaga bajtów dzieli w sposób następujący:

bits 0 to 4 FCHECK (check bits for CMF and FLG) 
bit 5  FDICT (preset dictionary) 
bits 6 to 7 FLEVEL (compression level) 

wartość fcheck musi być taka, CMF i FLG, widziana jako 16-bitową liczbę całkowitą bez znaku przechowywane w MSB kolejności (CMF * 256 + FLG) jest wielokrotnością 31.

FLEVEL (poziom kompresji) Te flagi są dostępne do użycia według określonych metod kompresji . W "korekta" metoda (CM = 8) ustawia te flagi jako następująco:

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

To jest świetna odpowiedź :), pomógł mi na wiele sposobów ... hej! fajny awatar – Ryan

74

zlib Magic nagłówków

78 01 - No Compression/low 
78 9C - Default Compression 
78 DA - Best Compression 
+0

Pomogło mi to określić rodzaj kompresji, z którą miałem do czynienia. Wiedziałem, że plik został skompresowany, ale szukał niektórych bajtów nagłówka i pojawiły się. Dzięki! – ProVega

+4

Podczas korzystania z Inflatora Java (używa ZLIB) widzę wartości nagłówków 120, -100. Odpowiada to 78 9C. Tworzy kopie zapasowe tego, co powiedziałeś powyżej. – Dan

10

Po Zlib jest skompresowany format danych.

+---+---+ 
|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) 
+---+---+---+---+ 

W większości przypadków FLG.FDICT (flaga słownika) nie jest ustawiony. W takich przypadkach po prostu nie ma urządzenia DICTID. Więc całkowity dźwięk to tylko 2 bajty.

Wartości nagłówka (CMF i FLG) bez słownika są zdefiniowane następująco.

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

Więcej na ZLIB RFC

0

Wszystkie odpowiedzi są tu najprawdopodobniej poprawne, jednak - jeśli chcesz manipulować strumień kompresji zlib bezpośrednio i został wyprodukowany przy użyciu gz_open, gzwrite, gzclose funkcje - to nie ma dodatkowych 10 wiodących bajtów nagłówek przed parą kompresji zlib pochodzi - a te są produkowane przez funkcję gz_open - nagłówek wygląda tak:

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); 

i wyniki w następujący hex Dump: 1F 8B 08 00 00 00 00 00 00 0B , po którym następuje strumień kompresji zlib.

Ale jest też spływu 8 bajtów - są uLong - CRC w ciągu całego pliku, uLong - nieskompresowany rozmiar pliku - poszukaj następujące bajty na końcu strumienia:

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

ZLIB/GZIP nagłówkom

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 nie ma wspólnych nagłówków

+0

Widzę, że zaproponowałeś znaczną zmianę w dwóch obecnie głosowanych głosowaniach. To znacznie zmieni odpowiedź. Nie proponuj takich zmian. Zamiast tego powinieneś opublikować komentarz, gdy masz wystarczającą reputację. –