Разъяснение спецификации сжатия сжатия

я надеюсь на этот вопрос (см .: внизу), чтобы выложить столько, сколько я знаю о процессе дефляции, и я могу получить исправления в тех областях, где я (возможно, очень) дезинформирован. Надеюсь, в конце этого вопроса, этот вопрос может быть полезным ресурсом.

Заголовок Zlib

Первые два байта равны заголовку для сжатия zlib, используемого с форматом (кредит)

---CMF---  ---FLG---
0111.1000  1101.0101
CINF -CM-  +-||
| |+- FCHECK
| +-- FDICT
+---- FLEVEL

От RFC 1950, справа налево:

  1. FCHECK (1.0101) — подтверждает, что CMF & FLG как 16-битное целое число без знака кратно 31

  2. FDICT (0) — если установлено, указывает предустановленный DICT, следующий сразу после FLG

  3. FLEVEL (11) — «интенсивность» сжатия [0-3]

  4. CM (1000) — для метода сжатия, где CM = 8 == метод «deflate» сжатия

  5. CINF (0111) — указывает размер используемого скользящего окна, где CINF = 7 == 32K скользящего окна

Заголовок блока данных

Следующие три бита в NEW BYTE соответствуют заголовку для кодированного блока Хаффмана:

---CMF---  ---FLG---  NEW BYTE
0111.1000  1101.0101  11101100
|-|
| +- BFINAL
+--- BTYPE

От RFC 1951 справа налево:

  1. BFINAL (0) — устанавливается (1), если это последний блок данных

  2. BTYPE (10) — кодировка Хаффмана: (00) нет; (01) Исправлены коды Хаффмана; (10) динамические коды; (11) недействительно

Коды Хаффмана

Отсюда я буду отрабатывать предположение BTYPE = (10)

Следующие значения немедленно продолжаются:

NEW BYTE                NXT BYTE
(11101)100       ->     101)(11101)   ->   0111111(1
|-|
| +- BFINAL
+--- BTYPE
  1. HLIT (11101) — 5-битное число длинных / буквенных кодов, добавлено 257 (257-286)

  2. HDIST (11101) — 5-битное количество кодов расстояния, 1 добавлено (1-32)

  3. 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

Мой вопрос

Неужели последние биты в скобках выше выброшены?

2

Решение

Нет. Единственные моменты времени в потоке дефляции, когда вы пропускаете биты для перехода к границе байтов, относятся к сохраненному блоку (00) или когда читается код конца в последнем блоке. После битов для длины кода длины кода вы продолжаете с последующими битами, чтобы использовать сгенерированный код Хаффмана для считывания длины кода.

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector