У меня проблемы с пониманием алгоритма Deflate (RFC 1951).Структура сжатого блока Deflate
TL; DR Как разобрать сжатый блок Deflate 4be4 0200
?
Я создал файл с буквой и новой строкой a\n
и запустил gzip a.txt
. Результирующая файл a.txt.gz
:
1f8b 0808 fe8b eb55 0003 612e 7478 7400
4be4 0200
07a1 eadd 0200 0000
Я понимаю, что первая строка заголовка с дополнительной информацией, а последняя строка CRC32 плюс размер входа (RFC 1951). Эти двое не беспокоят меня.
Но как интерпретировать сжатый блок (средняя линия)?
Вот шестнадцатеричное и двоичное представление этого:
4be4 0200
0100 1011
1110 0100
0000 0010
0000 0000
Насколько я понял, как-то эти из них:
Каждый блок сжатых данных начинается с 3 битами заголовка, содержащего следующие данные:
- первый бит BFINAL
- следующие 2 бита BTYPE
... на самом деле в конечном итоге на конце первого байта: 0100 1 . (Я пропущу вопрос, почему бы кто-нибудь назвать «заголовок» то, что на самом деле в хвосте что-то другое.)
RFC содержит что-то, что, насколько я понимаю, должно быть объяснение этому:
- элементы данных упакованы в байты в порядке увеличение номера бита в пределах байта, то есть, начиная с наименее значимым битом байта.
- Элементы данных, отличные от кодов Хаффмана, упакованы , начиная с наименее значимого бита данных элемент.
- Коды Хаффмана упакованы, начиная с самого- Значительная часть кода.
Другими словами, если бы нужно было распечатать сжатые данные, как последовательность байтов, начиная с первого байта в правого края и перейти к влево, с наиболее значимый Значительный бит каждого байта слева, как обычно, был бы , способный анализировать результат справа налево, с фиксированной шириной элементов в правильном порядке MSB-to-LSB и кодах Хаффмана в бит-обратном порядке (т. е. с первым битом кода в относительной позиции LSB ).
Но, к сожалению, я не понимаю этого объяснения.
Возврат на мои данные. ОК, поэтому BFINAL установлен, и BTYPE - это что? 10 или 01?
Как интерпретировать остальную информацию в этом сжатом блоке?
Ваши данные - это не только буква «a». Это буква «a», за которой следует новый символ строки, «\ n» или десятичный 10. Таким образом, здесь есть два байта, а не один. –
@MarkAdler Спасибо, что указали это. – EugZol
Вы можете использовать [infgen] (http://zlib.net/infgen.c.gz), дизассемблер дефлятного потока, чтобы помочь вам в понимании RFC 1951. Обе разборки потока в читаемом описании и сам код infgen.c также иллюстрирует построение формата дефляции. –