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ę?

Author: Mark, 2012-01-29

5 answers

Link do RFC

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
 59
Author: 0xbadc0de,
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 
 83
Author: VahidN,
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

 11
Author: mk..,
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ów
 8
Author: Cttr,
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-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));
 0
Author: TarmoPikaro,
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