Какой алгоритм используется в стандартном ZIP?

Я гуглил, читал вики и читал RFC ZIP, но не могу найти никакой информации о точном алгоритме, который используется в ZIP.

Я нашел информацию о ZIP == TAR + GZIP

Но меня смущает эта информация.

Поскольку GZIP, насколько я помню, использует алгоритм LZW, а TAR использует LZMA, я не представляю, как могло получиться так, что ZIP == TAR + GZIP (LZMA + LZW - ???)

Не могли бы вы помочь мне найти алгоритм ZIP? Я хочу реализовать это.


person Community    schedule 18.04.2012    source источник
comment
ZIP может использовать любой из нескольких алгоритмов. Где-то в сети валяется спецификация...   -  person Hot Licks    schedule 18.04.2012
comment
А, вот оно: Deflate, Deflate64, Implode, BZIP2, LZMA, или ППМд+.   -  person Hot Licks    schedule 18.04.2012


Ответы (2)


Zip предоставляет возможности, примерно эквивалентные комбинации tar и gzip.

tar просто собирает несколько файлов в один файл, сохраняя информацию об исходных файлах (например, пути, даты). Вопреки утверждению в вопросе, он не сжимает сам по себе.

gzip просто берет один файл и сжимает его.

Zip делает и то, и другое — т. е. сохраняет несколько составляющих файлов в архив (опять же, сохраняя такие вещи, как пути, даты и т. д.) и сжимает их. В отличие от tar + gzip, он сжимает каждый файл по отдельности и оставляет информацию «каталога» о составляющих файлах несжатой. Это упрощает работу с отдельными файлами в архиве (вставка, удаление, распаковка и т. д.), но также означает, что в целом сжатие обычно не так хорошо.

Вместо повторной реализации алгоритма сжатия zip вам почти наверняка лучше загрузить код (чрезвычайно переносимый, с очень либеральной лицензией) с веб-сайт zlib. На веб-сайте zlib есть достаточно разумное объяснение алгоритмов. Если вы действительно настаиваете на том, чтобы сделать это самостоятельно, вы, вероятно, также захотите ознакомиться с RFC 1950, 1951 и 1952.

person Jerry Coffin    schedule 18.04.2012
comment
Об этом также говорит Википедия. - person fb55; 18.04.2012
comment
Обратите внимание, что zlib реализует только сжатие/распаковку, а не механизм архивирования. - person Hot Licks; 18.04.2012
comment
@HotLicks: Правильно — если вам нужен код для части архивации, он находится на веб-сайте Info-zip. - person Jerry Coffin; 18.04.2012

«zip» в данном контексте — это формат файла, допускающий несколько различных методов сжатия. К ним относятся deflate, deflate64, bzip2, lzma, wavpack и ppmd. Однако на практике вы почти всегда будете видеть, что deflate используется исключительно в zip-файлах для совместимости.

deflate также является методом сжатия, используемым в gzip и zlib, а также в формате изображений png.

deflate - это компрессор LZ77, а не LZ78.

tar - это архиватор, а не компрессор. Он создает файл формата .tar. Файл .tar обычно сжимается (удобно самой программой tar, вызывающей внешние программы), что добавляет суффикс, например. .tar.gz для сжатия gzip. Опции tar включают -z для gzip, -j для bzip2 (.bz2) и -J для lzma (.xz).

Вам не нужно реализовывать алгоритм дефляции. Это было сделано для вас. Вы можете использовать zlib в своем коде, у которого очень либеральная лицензия.

person Mark Adler    schedule 19.04.2012