Этот вопрос относится к алгоритму 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, я гарантированно либо:
- Правильно распаковывать этот блок и последующие блоки
- обесточивания с «расстояние слишком далеко» ошибка
Другими словами, я гарантирую, что я никогда не буду без проблем распаковывать плохие данные (я не говорю о проверке CRC32 в конце gzip, но будет ли громко жаловаться zlib)?
Предположения:
- Предположим, что я в состоянии определить, подрозетники точки отлично. Давайте сделаем вид, что я не ошибочно идентифицирую случайные биты как маркер синхронизации, и что шаблон так не появляется в блоке типа 0. Это нереально, но просто предположите, что это правда.
- Предположим, что файл никогда не поврежден и всегда является законным gzip-файлом.
Спасибо. Это то, что я подозревал. – DSnet
В качестве дополнительного вопроса ... В ситуации, когда я идентифицирую точку Z_SYNC_FLUSH через файл, если я как-то точно знал, что такое предыдущие 32KiB несжатых данных, могу ли я всегда использовать inflateSetDictionary(), чтобы начать декомпрессию из этого на? – DSnet
Да. .......... –