2013-05-14 1 views
0

Этот вопрос относится к алгоритму DEFLATE, но относится к gzip и zlib.Резюме Деформация DEFLATE из точки смыва

Предположим, у меня есть файл gzip, который, как я знаю, содержит несколько точек смыва в файле. Некоторые из них сделаны с Z_SYNC_FLUSH и другими Z_FULL_FLUSH. Если я просматриваю файл, я могу найти все точки смыва, потому что они сразу же следуют шаблону 0000ffff.

Я знаю, что я могу возобновить декомпрессию в точках Z_FULL_FLUSH, потому что доступна вся информация, необходимая для распаковки (IE: словарь сбрасывается). Однако, если я попытаюсь выполнить распаковку с Z_SYNC_FLUSH, я обычно получаю сообщение об ошибке «zlib.error: Ошибка -3 при распаковке: недопустимое расстояние слишком далеко назад».

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

  1. Правильно распаковывать этот блок и последующие блоки
  2. обесточивания с «расстояние слишком далеко» ошибка

Другими словами, я гарантирую, что я никогда не буду без проблем распаковывать плохие данные (я не говорю о проверке CRC32 в конце gzip, но будет ли громко жаловаться zlib)?

Предположения:

  1. Предположим, что я в состоянии определить, подрозетники точки отлично. Давайте сделаем вид, что я не ошибочно идентифицирую случайные биты как маркер синхронизации, и что шаблон так не появляется в блоке типа 0. Это нереально, но просто предположите, что это правда.
  2. Предположим, что файл никогда не поврежден и всегда является законным gzip-файлом.

ответ

1

Если через Z_SYNC_FLUSH результатов в последующем потоке, который не дает расстояние слишком далеко ошибки, то это, случайно, что эквивалентно и неотличимым от Z_FULL_FLUSH.

Я бы не ожидал, что это произойдет очень часто.

+0

Спасибо. Это то, что я подозревал. – DSnet

+0

В качестве дополнительного вопроса ... В ситуации, когда я идентифицирую точку Z_SYNC_FLUSH через файл, если я как-то точно знал, что такое предыдущие 32KiB несжатых данных, могу ли я всегда использовать inflateSetDictionary(), чтобы начать декомпрессию из этого на? – DSnet

+0

Да. .......... –

Смежные вопросы