Jak wygląda nagłówek zlib?
W moim projekcie muszę wiedzieć jak wygląda zlib
nagłówek. Słyszałem, że jest to dość proste, ale nie mogę znaleźć żadnego opisu nagłówka zlib.
Na przykład, czy zawiera magiczną liczbę?
5 answers
0 1
+---+---+
|CMF|FLG|
+---+---+
CMF (metoda kompresji i flagi) Bajt ten dzieli się na 4-bitową metodę kompresji i 4- pole informacji bitowej w zależności od metody kompresji.
bits 0 to 3 CM Compression method
bits 4 to 7 CINFO Compression info
CM (metoda kompresji)
Identyfikuje to metodę kompresji używaną w pliku. CM = 8
oznacza metodę kompresji "deflate" z rozmiarem okna w górę
do 32K. jest to metoda używana przez gzip i PNG i prawie wszystko inne.
CM = 15 jest zarezerwowane.
CINFO (Compression info) Dla CM = 8, CINFO jest logarytmem bazowym-2 okna LZ77 rozmiar, minus osiem (CINFO = 7 oznacza rozmiar okna 32K). Wartości CINFO powyżej 7 nie są dozwolone w tej wersji Specyfikacja. CINFO nie jest zdefiniowany w niniejszej specyfikacji dla CM nie równa 8.
W praktyce oznacza to, że pierwszy bajt jest prawie zawsze 78
(hex)
FLG (flagi) Ten bajt flagi jest podzielony w następujący sposób:
bits 0 to 4 FCHECK (check bits for CMF and FLG)
bit 5 FDICT (preset dictionary)
bits 6 to 7 FLEVEL (compression level)
The FCHECK wartość musi być taka, że CMF i FLG, gdy są postrzegane jako 16-bitowa niepodpisana liczba całkowita przechowywana w porządku MSB (CMF*256 + FLG), jest wielokrotnością 31.
FLEVEL(Stopień sprężania) Flagi te są dostępne do użycia przez specyficzną kompresję metody. Metoda " deflate "(CM = 8
) ustawia te flagi jako
następuje:
0 - compressor used fastest algorithm
1 - compressor used fast algorithm
2 - compressor used default algorithm
3 - compressor used maximum compression, slowest algorithm
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-13 14:28:19
Zlib magiczne nagłówki
78 01 - No Compression/low
78 9C - Default Compression
78 DA - Best Compression
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-18 19:05:26
Poniżej znajduje się skompresowany format danych Zlib.
+---+---+
|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)
+---+---+---+---+
Przeważnie FLG.FDICT
(flaga słownika) nie jest ustawiona. W takich przypadkach DICTID
po prostu nie występuje. Więc całkowity słuch to tylko 2 bajty.
Wartości nagłówka (CMF
i FLG
) bez słownika są zdefiniowane w następujący sposób.
CMF | FLG
0x78 | 0x01 - No Compression/low
0x78 | 0x9C - Default Compression
0x78 | 0xDA - Best Compression
Więcej na ZLIB RFC
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-22 03:21:29
Nagłówki ZLIB/GZIP
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ówWarning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-02 16:12:48
Wszystkie odpowiedzi są prawdopodobnie poprawne , jednak - jeśli chcesz bezpośrednio manipulować strumieniem kompresji Zlib, a został on wytworzony za pomocą funkcji gz_open, gzwrite, gzclose
- wtedy jest dodatkowe 10 wiodących bajtów nagłówka przed nadejściem pary kompresji Zlib - a te są wytwarzane przez funkcję gz_open-header 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 powoduje następujący zrzut hex: 1F 8B 08 00 00 00 00 00 00 0B
następnie strumień kompresji zlib.
Ale jest też 8 bajtów-są to uLong
- crc nad całką plik, uLong
- nieskompresowany Rozmiar pliku-poszukaj następujących bajtów na końcu strumienia:
putLong (s->file, s->crc);
putLong (s->file, (uLong)(s->in & 0xffffffff));
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-07 05:12:27