Алгоритм сжатия, используемый в zlib, по существу такой же, как в gzip и zip. Что такое gzip и zip? Как они различаются и как они одинаковы?
Как связаны zlib, gzip и zip? Что у них общего и как они отличаются?
Ответ 1
Краткая форма:
.zip
- это формат архива, используя, как правило, метод сжатия Deflate. Формат .gz
gzip предназначен для одиночных файлов, также используя метод сжатия Deflate. Часто gzip используется в сочетании с tar для создания сжатого формата архива, .tar.gz
. Библиотека zlib предоставляет код сжатия и декомпрессии Deflate для использования zip, gzip, png (который использует zlib wrapper для дефлятных данных) и многих других приложений.
Длинная форма:
Формат ZIP был разработан Филом Кацем как открытый формат с открытой спецификацией, где его реализация PKZIP была условно-бесплатной. Это формат архива, в котором хранятся файлы и их структура каталогов, где каждый файл индивидуально сжат. Тип файла .zip
. Файлы, а также структура каталогов могут быть зашифрованы.
Формат ZIP поддерживает несколько методов сжатия:
0 - The file is stored (no compression)
1 - The file is Shrunk
2 - The file is Reduced with compression factor 1
3 - The file is Reduced with compression factor 2
4 - The file is Reduced with compression factor 3
5 - The file is Reduced with compression factor 4
6 - The file is Imploded
7 - Reserved for Tokenizing compression algorithm
8 - The file is Deflated
9 - Enhanced Deflating using Deflate64(tm)
10 - PKWARE Data Compression Library Imploding (old IBM TERSE)
11 - Reserved by PKWARE
12 - File is compressed using BZIP2 algorithm
13 - Reserved by PKWARE
14 - LZMA (EFS)
15 - Reserved by PKWARE
16 - Reserved by PKWARE
17 - Reserved by PKWARE
18 - File is compressed using IBM TERSE (new)
19 - IBM LZ77 z Architecture (PFS)
97 - WavPack compressed data
98 - PPMd version I, Rev 1
Методы 1-7 являются историческими и не используются. Способы с 9 по 98 являются относительно недавними добавлениями и находятся в разных, небольших количествах использования. Единственным методом по-настоящему широко используемого в формате ZIP является метод 8, Deflate и метод меньшей степени 0, который вообще не является сжатием. Практически каждый .zip
файл, который вы встретите в дикой природе, будет использовать исключительно методы 8 и 0, скорее всего, только метод 8. (Метод 8 также имеет средства для эффективного хранения данных без сжатия и относительно небольшого расширения, а метод 0 не может быть потоковым, тогда как метод 8 может быть.)
Стандарт ISO/IEC 21320-1: 2015 для файловых контейнеров - это ограниченный формат zip, например, используемый в файлах архива Java (.jar), Office Open XML файлы (Microsoft Office.docx,.xlsx,.pptx), файлы формата документа Office (.odt,.ods,.odp) и файлы EPUB (.epub). Этот стандарт ограничивает методы сжатия до 0 и 8, а также другие ограничения, такие как отсутствие шифрования или подписи.
Примерно в 1990 году группа Info-ZIP написала портативные, бесплатные версии с открытым исходным кодом утилиты zip
и unzip
, поддерживающие сжатие с использованием формата Deflate, и декомпрессии этого и более ранних форматов. Это значительно расширило использование формата .zip
.
В начале 90-х годов формат gzip был разработан в качестве замены утилиты Unix compress
, полученный из кода Deflate в утилитах Info-ZIP. Unix compress
был разработан для сжатия одного файла или потока, добавляя .Z
к имени файла. compress
использует алгоритм сжатия LZW, который в то время находился под патентом, и его свободное использование оспаривалось патентообладателями. Хотя некоторые конкретные реализации Deflate были запатентованы Филом Кацем, формат не был, и поэтому было возможно написать реализацию Deflate, которая не нарушала бы никаких патентов. За последние 20 лет эта реализация не была столь сложной. Утилита Unix gzip
была предназначена для замены на compress
и фактически способна распаковывать сжатые данные compress
(предполагая, что вы смогли разобрать это предложение). gzip
добавляет .gz
к имени файла. gzip
использует сжатый формат данных Deflate, который сжимается немного лучше, чем Unix compress
, имеет очень быструю декомпрессию и добавляет CRC-32 в качестве проверки целостности данных. Формат заголовка также позволяет хранить больше информации, чем допустимый формат compress
, такой как исходное имя файла и время изменения файла.
Хотя compress
только сжимает один файл, было общепринято использовать утилиту tar
для создания архива файлов, их атрибутов и их структуры каталогов в один файл .tar
, а затем сжать его с помощью compress
сделать файл .tar.Z
. На самом деле утилита tar
имела и все еще имеет возможность выполнять сжатие одновременно, вместо того, чтобы передавать вывод tar
в compress
. Все это переносится в формат gzip, а tar
имеет возможность напрямую сжимать формат .tar.gz
. Формат tar.gz
сжимается лучше, чем подход .zip
, поскольку сжатие .tar
может использовать избыточность между файлами, особенно много небольших файлов. .tar.gz
- самый распространенный формат архива, используемый в Unix из-за его очень высокой переносимости, но есть и более эффективные методы сжатия, поэтому вы часто увидите архивы .tar.bz2
и .tar.xz
.
В отличие от .tar
, .zip
имеет центральный каталог в конце, который предоставляет список содержимого. Это и отдельное сжатие обеспечивает произвольный доступ к отдельным записям в файле .zip
. Файл .tar
должен быть распакован и отсканирован от начала до конца, чтобы создать каталог, в котором указан файл .tar
.
Вскоре после введения gzip, примерно в середине 1990-х годов, тот же патентный спор поставил под вопрос свободное использование формата изображения .gif
, очень широко используемого на досках объявлений и в World Wide Web (новое в время). Поэтому небольшая группа создала формат PNG без потерь сжатого изображения с типом файла .png
, чтобы заменить .gif
. В этом формате также используется формат Deflate для сжатия, который применяется после того, как фильтры данных изображения отображают больше избыточности. Чтобы способствовать широкому использованию формата PNG, были созданы две бесплатные библиотеки кода. libpng и zlib. libpng обработал все возможности формата PNG, а zlib предоставил код сжатия и декомпрессии для использования libpng, а также для других приложений. zlib был адаптирован из кода gzip
.
Все указанные патенты с тех пор истекли.
Библиотека zlib поддерживает сжатие и декомпрессию Deflate и три вида обтекания потоков дефляции. Это: отсутствие обертывания ( "сырой" дефлат), zlib wrapping, который используется в блоках данных формата PNG и gzip wrapping, для предоставления подпрограмм gzip для программист. Основное различие между zlib и gzip-упаковкой заключается в том, что упаковка zlib более компактна, шесть байт против 18 символов для gzip, а проверка целостности Adler-32 работает быстрее, чем CRC-32, который использует gzip. Исходный спуск используется программами, которые читают и записывают формат .zip
, который является другим форматом, который обертывает сжатые сжатые данные.
zlib теперь широко используется для передачи и хранения данных. Например, большинство транзакций HTTP серверами и браузерами сжимают и распаковывают данные с помощью zlib.
Различные реализации дефлята могут приводить к разному сжатому результату для одних и тех же входных данных, о чем свидетельствует наличие выбираемых уровней сжатия, которые позволяют снизить эффективность сжатия для процессорного времени. zlib и PKZIP не являются единственными реализациями сжатия и декомпрессии дефляции. Обе утилиты 7-Zip-архивирования и Google библиотека zopfli имеют возможность использовать гораздо больше процессорного времени, чем zlib чтобы выжать последние несколько бит при использовании формата дефляции, уменьшив сжатые размеры на несколько процентов по сравнению с самым высоким уровнем сжатия zlib. утилита pigz, параллельная реализация gzip, включает в себя возможность использования zlib (уровни сжатия 1-9) или zopfli (уровень сжатия 11) и несколько смягчает время влияние использования zopfli путем разделения сжатия больших файлов на несколько процессоров и ядер.
Ответ 2
ZIP - это формат файла, используемый для хранения произвольного количества файлов и папок вместе с сжатием без потерь. Он не делает строгих предположений о применяемых методах сжатия, но чаще всего используется с DEFLATE.
Gzip - это алгоритм сжатия, основанный на DEFLATE, но менее обремененный потенциальными патентами и др. и формат файла для хранения одного сжатого файла. Он поддерживает сжатие произвольного количества файлов и папок в сочетании с tar. Полученный файл имеет расширение .tgz
или .tar.gz
и обычно называется tarball.
zlib - это библиотека функций, инкапсулирующих DEFLATE в ее наиболее распространенную LZ77 воплощение.
Ответ 3
Самое важное отличие состоит в том, что gzip способен только сжимать один файл, а zip сжимает несколько файлов один за другим и затем архивирует их в один файл.
Таким образом, gzip обычно используется вместе с tar (есть и другие возможности). Это происходит вместе с некоторыми преимуществами.
Если у вас большой архив, и вам нужен только один файл, вам нужно распаковать весь файл gzip, чтобы перейти к этому файлу. Это не требуется, если у вас есть zip файл.
С другой стороны, если вы сжимаете 10 похожих или даже идентичных файлов, zip-архив будет намного больше, потому что каждый файл сжимается индивидуально, тогда как в gzip в сочетании с tar один файл сжимается, что намного эффективнее, если файлы аналогичный (равный).