Как найти положение центрального каталога в Zip-файле? - PullRequest
10 голосов
/ 21 декабря 2011

Я пытаюсь найти положение первого заголовка файла Central Directory в Zip-файле.

Я читаю эти слова: http://en.wikipedia.org/wiki/Zip_(file_format) http://www.pkware.com/documents/casestudies/APPNOTE.TXT

КакЯ вижу это, я могу только сканировать данные Zip, определять по заголовку, в каком разделе я нахожусь, и затем делать это, пока не попаду в заголовок Central Directory.Я бы, очевидно, прочитал заголовки файлов до этого и использовал бы «сжатый размер», чтобы пропустить фактические данные, а не циклически перебирать каждый байт в файле ...

Если я так делаю, тоЯ практически уже знаю все файлы и папки внутри Zip-файла, и в этом случае я больше не вижу смысла в использовании Центрального каталога.

Насколько я понимаю, цель Центрального каталога - перечислить метаданные файла иположение фактических данных в Zip-файле, чтобы вам не нужно было сканировать весь файл?

После прочтения записи Конца центрального каталога Википедия говорит:

Этоупорядочение позволяет создать zip-файл за один проход, но обычно он распаковывается при первом чтении центрального каталога в конце.

Как мне легко найти запись End of Central Directory?Нам нужно помнить, что там могут быть комментарии произвольного размера, поэтому я не знаю, сколько байтов в конце потока данных находится в нем.Я просто сканирую это?

PS Я пишу программу для чтения Zip-файлов.

Ответы [ 3 ]

8 голосов
/ 09 января 2013

Начните с конца и просканируйте в начало, ища конец подписи каталога и считая количество отсканированных вами байтов.Когда вы найдете кандидата, получите смещение байта 20 для длины комментария (L).Проверьте, соответствует ли L + 20 вашему текущему количеству.Затем убедитесь, что начало центрального каталога (на которое указывает смещение байта 12) имеет соответствующую сигнатуру.

Если вы предполагали, что биты были довольно случайными, когда проверка сигнатуры оказалась дикой догадкой (например,предполагают посадку в сегмент данных), вероятность получения всех правильных битов подписи довольно мала.Вы можете уточнить это и выяснить вероятность попадания в сегмент данных и вероятность попадания в допустимый заголовок (как функция количества таких заголовков), но это уже звучит как низкая вероятность для меня.Вы можете повысить свой уровень доверия, проверив подпись первой записи в файле, но убедитесь, что обработали границу пустого zip-файла.

1 голос
/ 11 января 2014

Просто скрестите пальцы и надейтесь, что нет записи с CRC, отметкой времени или отметкой даты как 06054B50, или любой другой последовательностью из четырех байтов, которая оказывается 06054B50.

1 голос
/ 22 декабря 2011

Я закончил цикл байтами, начиная с конца. Цикл останавливается, если он находит совпадающую последовательность байтов, индекс ниже нуля или если он уже прошел 64 Кбайт.

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