Алгоритм сжатия, используемый в zlib, по сути, такой же, как в gzip и zip. Что такое gzip и zip? Чем они отличаются и чем похожи?
Краткая форма:
.zip
- формат архива, использующий, как правило, метод сжатия Deflate. Формат .gz
gzip предназначен для отдельных файлов и также использует метод сжатия Deflate. Часто gzip используется в сочетании с tar для создания сжатого архивного формата, .tar.gz
. Библиотека zlib предоставляет код сжатия и распаковки Deflate для использования zip, gzip, png (которая использует обертку zlib для данных deflate) и многих других приложений.
Длинная форма:_
Формат ZIP был разработан Филом Катцем как открытый формат с открытой спецификацией, а его реализация, PKZIP, была shareware. Это формат архива, который хранит файлы и их структуру каталогов, где каждый файл сжимается индивидуально. Тип файла - .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 Document Format (.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
, очень широко применявшегося на досках объявлений и во Всемирной паутине (в то время это было в новинку). Поэтому небольшая группа создала формат сжатых без потерь изображений PNG с типом файла .png
, чтобы заменить .gif
. Этот формат также использует для сжатия формат Deflate, который применяется после того, как фильтры данных изображения выявляют больше избыточности. Для того чтобы способствовать широкому использованию формата PNG, были созданы две свободные библиотеки кода. libpng и zlib. libpng поддерживает все возможности формата PNG, а zlib предоставляет код сжатия и распаковки для использования в libpng, а также в других приложениях. zlib была адаптирована из кода gzip
.
Срок действия всех упомянутых патентов истек.
Библиотека zlib поддерживает сжатие и распаковку Deflate, а также три вида обертывания потоков Deflate. Это: полное отсутствие обертки ("сырой" deflate), zlib wrapping, которая используется в блоках данных формата PNG, и gzip wrapping, предоставляющая программисту процедуры gzip. Основное различие между zlib и gzip wrapping заключается в том, что zlib wrapping более компактна, шесть байт против минимум 18 байт для gzip, а проверка целостности, Adler-32, работает быстрее, чем CRC-32, которую использует gzip. Raw deflate используется программами, которые читают и записывают формат .zip
, который является еще одним форматом, оборачивающим сжатые данные deflate.
В настоящее время zlib широко используется для передачи и хранения данных. Например, большинство HTTP-транзакций серверов и браузеров сжимают и распаковывают данные с помощью zlib.
Различные реализации deflate могут приводить к различным результатам сжатия одних и тех же входных данных, о чем свидетельствует существование выбираемых уровней сжатия, позволяющих компенсировать эффективность сжатия за счет процессорного времени. zlib и PKZIP - не единственные реализации сжатия и распаковки deflate. Утилита архивации 7-Zip и библиотека Google zopfli способны использовать гораздо больше процессорного времени, чем zlib, чтобы выжать последние несколько битов, возможных при использовании формата deflate, уменьшая сжатые размеры на несколько процентов по сравнению с zlib' с максимальным уровнем сжатия. Утилита pigz, параллельная реализация gzip, включает возможность использования zlib (уровни сжатия 1-9) или zopfli (уровень сжатия 11), и несколько смягчает временное воздействие использования zopfli, разделяя сжатие больших файлов на несколько процессоров и ядер.
ZIP - это формат файлов, используемый для хранения произвольного количества файлов и папок вместе со сжатием без потерь. Он не делает строгих предположений относительно используемых методов сжатия, но чаще всего используется вместе с DEFLATE.
Gzip - это и алгоритм сжатия, основанный на DEFLATE, но менее обремененный потенциальными патентами и т.д., и формат файла для хранения одного сжатого файла. Он поддерживает сжатие произвольного количества файлов и папок в сочетании с tar. Полученный файл имеет расширение .tgz
или .tar.gz
и обычно называется tarball.
zlib - это библиотека функций, инкапсулирующая DEFLATE в его наиболее распространенном воплощении LZ77.
Самое главное отличие заключается в том, что gzip способен сжимать только один файл, в то время как zip сжимает несколько файлов по одному, а затем архивирует их в один файл. Таким образом, gzip чаще всего используется вместе с tar (хотя есть и другие возможности). Это сопровождается некоторыми (не)преимуществами.
Если у вас большой архив и вам нужен только один файл из него, вам придется распаковать весь файл gzip, чтобы добраться до этого файла. Этого не требуется, если у вас zip-файл.
С другой стороны, если вы сжимаете 10 одинаковых или даже идентичных файлов, архив zip будет намного больше, потому что каждый файл сжимается отдельно, в то время как в gzip в сочетании с tar сжимается один файл, что намного эффективнее, если файлы похожи (одинаковы).