Как интерпретировать эти два несжатых образца zlib? - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь научиться читать спецификации.Давайте посмотрим, что получится после попытки сжатия: 1) пустой буфер и 2) восклицательный знак:

>>> zlib.compress(b'', 0)
b'x\x01\x01\x00\x00\xff\xff\x00\x00\x00\x01'
>>> zlib.compress(b'!', 0)
b'x\x01\x01\x01\x00\xfe\xff!\x00"\x00"'

До сих пор я обнаружил, что x\x01 - это магический формат, говорящий нам, что мы ищемна несжатом образце zlib.Тогда есть \x01, который я не могу интерпретировать (я полагаю, это означает, что «следует несжатый блок») и \x01\x00, который выглядит как длина буфера, после чего есть \xfe\xff (который, похоже, будет уменьшаться, если я добавлю большебайт), затем данные и четыре байта, которые кажутся контрольной суммой Адлера.

Теперь мой вопрос: как я могу узнать, что означают третий и следующие четыре байта?

Кроме того, есть ли способ пропустить контрольную сумму Адлера и при этом произвести что-то, что zlib.decompress() может обработать?Другими словами, существует ли более короткая минимальная выборка буфера Zlib?

1 Ответ

0 голосов
/ 04 октября 2018

Формат оболочки zlib можно найти в RFC 1950 , а формат сжатых данных, сжатых по дефляту, которые он упаковывает, можно найти в RFC 1951 .

x\x01 - заголовок zlib, а \x00\x00\x00\x01 в конце - проверка Adler-32.В середине находится один сохраненный блок дефляции, который идентифицируется \x01, который представляет собой трехбитовый заголовок, начинающийся с младшего значащего бита, равного единице, что указывает на то, что это последний блок дефляции в потоке и следующийдва бита - это нули, обозначающие сохраненный блок.Остальные пять битов являются битами заполнения, чтобы привести поток к границе байта.Тогда \x00\x00\xff\xff - это двухбайтовая длина сохраненного содержимого блока (0), за которой следует дополнение длины к одному в качестве проверки ошибки.Вот и все для пустого сохраненного блока.

Для сохраненного блока с восклицательным знаком разница в том, что длина равна единице (обратите внимание, что длина в порядке с прямым порядком байтов), за которой следует дополнение, итогда сам восклицательный знак.Контрольное значение Adler-32 соответствует сообщению с одним байтом, который является восклицательным знаком.

Вы можете использовать zlib.compressobj, которому можно дать wbits, равный -15, чтобы запросить необработанный поток дефляции сбез оболочки zlib.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...