Согласно этой проблеме (# 48) с библиотекой узлов yauzl и , обсуждаемым здесь , существует ошибка со спецификацией zip, и это легко создать недействительные файлы zip.
Высокоуровневая структура файла .zip диктует, что читатель должен сначала найти Конец записи центрального каталога, который находится в самом конце файла .zip. Последнее поле конца записи центрального каталога - это комментарий переменной длины. Длина комментария записывается в поле в конце записи центрального каталога перед самим комментарием. ... буквально единственный способ найти Конец Центральной Каталогной Записи - это использовать эвристику, чтобы угадать, где создатель zip-файла имел в виду это. Спецификация файла .zip неоднозначна; это недостатки.
yauzl ищет магическое число в обратном направлении, и как только оно найдено, yauzl выполняет дополнительную проверку, чтобы убедиться, что это магическое число действительно является частью Конечной записи центрального каталога. Эта проверка включает проверку всех полей в конце записи центрального каталога, включая проверку правильности поля длины комментария. Если какое-либо из полей выглядит подозрительным, zipfile отклоняется.
В настоящее время недопустимые zip-файлы выдают ошибку «недопустимая длина комментария» в yauzl (и, возможно, в других библиотеках, соответствующих спецификации). В этом выпуске упоминается, как исправить недопустимые zip-файлы:
... можно в последний момент восстановить zip-файл, удалив байты из конца zip-файла. Чтобы сделать это, найдите магический номер в обратном направлении от конца (см. Упоминание в спецификации «центральной подписи заголовка файла») и удалите все, что следует за концом записи центрального каталога.
Но нет примеров того, как реализовать это исправление. Таким образом, мой вопрос: учитывая ситуацию, когда у нас есть файловый буфер с недопустимым почтовым индексом, содержащим комментарий недопустимой длины, как бы мы «искали магический номер в обратном направлении от конца и удаляли все, что следует за концом центрального Запись справочника "?