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ę?
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ę?
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
zlib Magic nagłówków
78 01 - No Compression/low
78 9C - Default Compression
78 DA - Best Compression
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
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
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
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));
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
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ę. –
To jest świetna odpowiedź :), pomógł mi na wiele sposobów ... hej! fajny awatar – Ryan