я надеюсь на этот вопрос (см .: внизу), чтобы выложить столько, сколько я знаю о процессе дефляции, и я могу получить исправления в тех областях, где я (возможно, очень) дезинформирован. Надеюсь, в конце этого вопроса, этот вопрос может быть полезным ресурсом.
Первые два байта равны заголовку для сжатия zlib, используемого с форматом (кредит)
---CMF--- ---FLG---
0111.1000 1101.0101
CINF -CM- +-||
| |+- FCHECK
| +-- FDICT
+---- FLEVEL
От RFC 1950, справа налево:
FCHECK (1.0101) — подтверждает, что CMF & FLG как 16-битное целое число без знака кратно 31
FDICT (0) — если установлено, указывает предустановленный DICT, следующий сразу после FLG
FLEVEL (11) — «интенсивность» сжатия [0-3]
CM (1000) — для метода сжатия, где CM = 8 == метод «deflate» сжатия
CINF (0111) — указывает размер используемого скользящего окна, где CINF = 7 == 32K скользящего окна
Следующие три бита в NEW BYTE соответствуют заголовку для кодированного блока Хаффмана:
---CMF--- ---FLG--- NEW BYTE
0111.1000 1101.0101 11101100
|-|
| +- BFINAL
+--- BTYPE
От RFC 1951 справа налево:
BFINAL (0) — устанавливается (1), если это последний блок данных
BTYPE (10) — кодировка Хаффмана: (00) нет; (01) Исправлены коды Хаффмана; (10) динамические коды; (11) недействительно
Отсюда я буду отрабатывать предположение BTYPE = (10)
Следующие значения немедленно продолжаются:
NEW BYTE NXT BYTE
(11101)100 -> 101)(11101) -> 0111111(1
|-|
| +- BFINAL
+--- BTYPE
HLIT
(11101) — 5-битное число длинных / буквенных кодов, добавлено 257 (257-286)
HDIST
(11101) — 5-битное количество кодов расстояния, 1 добавлено (1-32)
HCLEN
(1111) — 4-битное количество кодов длины кода, добавлено 4 (4-19)
Сразу после этого HCLEN
(не забудьте +4) 3-битные поля, где значения присваиваются этой последовательности в следующем порядке:
16 17 18 0 8 7 9 6 10 5 11 4 12 3 13 2 14 1 15
Поскольку HCLEN = 19, используется вся последовательность
Длина кода 0
в этой последовательности означает, что соответствующий символ не используется.
В качестве графического примера, после чтения битов 19×3 у нас есть шесть дополнительных битов (дополнительные биты в скобках):
NXT BYTE 00000000 00000000 00000000 00000000 00000000 00000000 [000000](00
Неужели последние биты в скобках выше выброшены?
Нет. Единственные моменты времени в потоке дефляции, когда вы пропускаете биты для перехода к границе байтов, относятся к сохраненному блоку (00) или когда читается код конца в последнем блоке. После битов для длины кода длины кода вы продолжаете с последующими битами, чтобы использовать сгенерированный код Хаффмана для считывания длины кода.
Других решений пока нет …