Как выглядит заголовок zlib? - PullRequest
56 голосов
/ 29 января 2012

В моем проекте мне нужно знать, как выглядит заголовок zlib.Я слышал, что это довольно просто, но я не могу найти описание заголовка zlib.

Например, содержит ли оно магическое число?

Ответы [ 6 ]

91 голосов
/ 18 июня 2013

магические заголовки zlib

78 01 - No Compression/low
78 9C - Default Compression
78 DA - Best Compression 
66 голосов
/ 29 января 2012

Ссылка на RFC

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

CMF (метод сжатия и флаги) Этот байт разделен на 4-битный метод сжатия и 4- битовое информационное поле в зависимости от метода сжатия.

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

см (метод сжатия) Это определяет метод сжатия, используемый в файле. CM = 8 обозначает метод сжатия "deflate" с размером окна вверх до 32К. Этот метод используется gzip и PNG и почти всем остальным. CM = 15 зарезервировано.

CINFO (информация о сжатии) Для CM = 8, CINFO является логарифмом по основанию 2 окна LZ77 размер, минус восемь (CINFO = 7 означает размер окна 32 КБ). Ценности CINFO выше 7 не допускаются в этой версии Спецификация. CINFO не определен в этой спецификации для CM не равен 8.

На практике это означает, что первый байт почти всегда 78 (hex)

ФЛГ (ФЛАГ) Этот байт флага делится следующим образом:

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

Значение FCHECK должно быть таким, чтобы CMF и FLG, если смотреть как 16-разрядное целое число без знака, сохраненное в порядке MSB (CMF * 256 + FLG), кратно 31.

FLEVEL (Уровень сжатия) Эти флаги доступны для использования определенным сжатием методы. Метод "deflate" (CM = 8) устанавливает эти флаги как следующим образом:

        0 - compressor used fastest algorithm
        1 - compressor used fast algorithm
        2 - compressor used default algorithm
        3 - compressor used maximum compression, slowest algorithm
14 голосов
/ 12 июня 2015

Ниже приведен формат сжатых данных 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)
 +---+---+---+---+

В основном, FLG.FDICT (флаг словаря) не установлен. В таких случаях DICTID просто отсутствует. Таким образом, общее слышимое составляет всего 2 байта.

Значения заголовка (CMF и FLG) без словаря определяются следующим образом.

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

Больше на ZLIB RFC

13 голосов
/ 02 апреля 2017

заголовки 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 нет общих заголовков

1 голос
/ 28 февраля 2019

Заголовок ZLIB (как определено в RFC1950 ) является 16-разрядным значением с прямым порядком байтов. Содержит эти поля от наиболее значимых до наименее значимых:

  • CINFO (биты 12-15)
    Указывает размер окна как степень двух, от 0 (256) до 7 (32768). 7 обычно. Более высокие значения не допускаются.

  • CM (биты 8-11)
    Метод сжатия. Допускается только Deflate (8).

  • FLEVEL (биты 6-7)
    Примерно указывает уровень сжатия, от быстрого / низкого (0) до медленного / высокого (3)

  • FDICT (бит 5)
    Указывает, используется ли заданный словарь. Обычно это 0, технически разрешено, но я не знаю ни одного формата Deflate, определяющего предустановленные словари.

  • FCHECK (биты 0-4)
    Контрольная сумма, значение которой рассчитывается так, что все значение делится на 31 без остатка. *

Как правило, только поля CINFO и FLEVEL могут быть свободно изменены. В других полях нет выбора, поэтому допустимы всего 32 возможных заголовка. Вот они:

      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

Поле CINFO редко, если вообще когда-либо, устанавливается компрессорами в любое значение, отличное от 7 (указывающее максимальное окно 32 КБ), поэтому единственными значениями, которые вы, вероятно, увидите в дикой природе, являются четыре в нижнем ряду (начиная с 78).

* (Вы можете задаться вопросом, есть ли небольшая свобода действий в значении FCHECK - можно ли установить 0 или 31, если оба проходят контрольную сумму? На практике, однако, нет любые допустимые заголовки, в которых возникает такая ситуация, поэтому нам не нужно об этом беспокоиться.)

0 голосов
/ 07 декабря 2016

Все ответы здесь, скорее всего, правильные - если вы хотите напрямую манипулировать потоком сжатия ZLib, и он был создан с использованием функций gz_open, gzwrite, gzclose - тогда перед началом потока сжатия zlib есть дополнительный заголовок в 10 байтов - и те создаются функцией gz_open - заголовок выглядит так:

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

И в результате получается следующий шестнадцатеричный дамп: 1F 8B 08 00 00 00 00 00 00 0B затем поток сжатия zlib.

Но есть также конечные 8 байтов - они uLong - crc по всему файлу, uLong - размер несжатого файла - ищите следующие байты в конце потока:

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