Разобрать байты zip-файла?
Я запрашиваю zip-файл из API и пытаюсь получить его по байтовому диапазону (установка заголовка Range), а затем анализировать каждую из частей по отдельности. Прочитав немного о сжатии gzip и zip, мне трудно понять:
Можно ли разобрать часть из файла zip?
Я знаю, что файлы gzip обычно сжимают один файл, так что вы можете распаковать и разобрать его по частям, но как насчет файлов zip?
Я использую node-js и пробовал несколько библиотек, таких как adm-zip или zlib, но не похоже, что они допускают такую возможность.
1 ответ
Zip-файлы имеют каталог в конце файла (в дополнение к той же базовой информации перед каждым элементом), в котором перечислены имена файлов и расположение в zip-файле каждого элемента. Обычно каждый элемент сжимается с использованием deflate, который является тем же алгоритмом, который использует gzip (но gzip имеет собственный заголовок перед потоком deflate).
Так что да, вполне возможно извлечь сжатый поток байтов для одного элемента в zip-файле и добавить предварительно изготовленный заголовок gzip (минимальный размер этого заголовка - 14 байтов IIRC), чтобы вы могли распаковать только этот файл, передав его в Gunzip.
Если вы хотите написать код для раздувания дефлированного потока самостоятельно, я рекомендую вам составить другой план. Я сделал это, и это действительно не весело. Используйте zlib, если вы должны это сделать, не пытайтесь переопределить декомпрессию.