Тема: zlib 1950
Показать сообщение отдельно
  #2  
Старый 02.03.2018, 08:00
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от frkbvfnjh
...Просьба по русски объяснить как устроен формат...
А что толку-то - знание формата саму библиотеку не улучшит, но раз надо, то тогда шестибайтовый заголовок архива имеет следующую структуру: первый байт - это поле CMF, оно в свою очередь состоит из двух ячеек по 4 бита CINFO и СМ, следующий байт - флаговый, это поле FLG, делится неравномерно на три ячейки - начальные 2 бита - это ячея FLEVEL, следующий 1 бит отводится под FDICT и 5 оставшихся бит идут под FCHECK, заключительные 4 байта заголовка - это поле DICTID.
Разбор полей
Цитата:
Сообщение от habrahabr.ru/post/274825
CMF (Compression method and flags). Этот байт разделен на 2 ячейки по 4 бита в каждой: CM (Compression method), CINFO (Compression info).

CM (Compression method). Данное поле определяет метод сжатия, используемого в файле. CM = 8 обозначает, что используется Deflate с размером окна до 32 килобайт.

CINFO (Compression info). Когда CM = 8, CINFO — это логарифм с основанием 2, задающий значение размера окна минус 8 (CINFO = 7, задает размер окна, равный 32 килобайтам).

FLG (Flags). Этот байт разделен на части следующим образом: FCHECK, FDICT, FLEVEL.

FCHECK (check bits for CMF and FLG). Рассмотрим значение выражения sum = (CMF * 256 + FLG) как шестнадцатибитное целое число без знака. Данное поле дополняет FLG так, чтобы значение sum было кратно 31.

FDICT (Preset dictionary). Если данный флаг установлен, то описатель словаря DICT следует сразу за байтом FLG. Распаковщик может использовать значение данного поля для определения словаря, который использовался при сжатии.

FLEVEL (Compression level). Это поле используется особыми алгоритмами сжатия. Deflate (CM = 8): 0 — наиболее быстрое сжатие, 1- быстрое сжатие, 2 — сжатие по умолчанию, 3 — максимальное сжатие (наиболее медленно). Значение данного поля не учитывается при распаковке. Используется для того, чтобы указать, имеет ли смысл, дополнительное сжатие.

После DICT (если установлен FDICT) следует описатель словаря, в конце порции zlib идет контрольная сумма ADLER-32, высчитанная по несжатым данным по алгоритму Adler-32...
Прогнал данную библиотеку (zlib128, D7, W10x64) во всех доступных режимах и вариантах алгоритма сжатия\распаковки :-: на локальных архивах исключений не возникает
Ответить с цитированием