Как связаны между собой zlib, gzip и zip? Что у них общего и чем они отличаются?

948

Алгоритм сжатия, используемый в zlib, по сути такой же, как в gzip и zip . Что такое gzip и zip ? Чем они отличаются и как они одинаковы?

Абхишек Джайн
источник

Ответы:

2476

Краткая форма:

.zipэто формат архива, использующий, как правило, метод сжатия Deflate . Формат .gzgzip предназначен для отдельных файлов, также с использованием метода сжатия Deflate. Часто GZIP используется в сочетании с дегтем , чтобы сделать сжатый архивный формат , .tar.gz. Библиотека zlib предоставляет код сжатия и распаковки Deflate для использования zip, gzip, png (который использует оболочку zlib для данных deflate) и многими другими приложениями.

Длинная форма:

Формат 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 Document Файлы форматирования (.odt, .ods, .odp) и файлы EPUB (.epub). Этот стандарт ограничивает методы сжатия 0 и 8, а также другие ограничения, такие как отсутствие шифрования или подписи.

Приблизительно в 1990 году группа Info-ZIP написала переносимые, бесплатные реализации zipи unzipутилиты с открытым исходным кодом, поддерживающие сжатие в формате Deflate и распаковку этого и более ранних форматов. Это значительно расширило использование .zipформата.

В начале 90-х формат gzip был разработан в качестве замены для утилиты Unixcompress , выведенной из кода Deflate в утилитах Info-ZIP. Unix compressбыл разработан для сжатия одного файла или потока, добавляя .Zк имени файла. compressиспользует алгоритм сжатия LZW , который в то время находился под патентом, и его бесплатное использование оспаривалось владельцами патентов. Хотя некоторые конкретные реализации Deflate были запатентованы Филом Кацем, формат не был, и поэтому можно было написать реализацию Deflate, которая не нарушала бы никаких патентов. Эта реализация не была такой сложной в последние 20 лет. gzipУтилита Unix была задумана как замена для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. К ним относятся: отсутствие переноса вообще («сырой» дефлят), перенос zlib , который используется в блоках данных формата PNG, и перенос gzip для обеспечения подпрограмм gzip для программиста. Основное различие между zlib и gzip-упаковкой заключается в том, что zlib-упаковка более компактна: шесть байт против минимум 18 байт для gzip, а проверка целостности Adler-32 выполняется быстрее, чем CRC-32, который использует gzip. Raw deflate используется программами, которые читают и записывают .zipформат, который является другим форматом, который оборачивает сжатие сжатых данных.

В настоящее время zlib широко используется для передачи и хранения данных. Например, большинство HTTP-транзакций серверами и браузерами сжимают и распаковывают данные с использованием zlib, в частности, HTTP-заголовок Content-Encoding: deflateозначает метод сжатия с дефляцией, заключенный в формат данных zlib .

Различные реализации deflate могут приводить к разным сжатым выходным данным для одних и тех же входных данных, о чем свидетельствует наличие выбираемых уровней сжатия, которые позволяют компенсировать эффективность сжатия за время процессора. zlib и PKZIP - не единственные реализации сжатия и распаковки с раздувом. И утилита архивирования 7-Zip, и библиотека Google zopfli имеют возможность использовать гораздо больше процессорного времени, чем zlib, чтобы выжать последние несколько битов при использовании формата deflate, сократив сжатые размеры на несколько процентов по сравнению с самым высоким zlib уровень сжатия. Утилита pigzпараллельная реализация gzip включает возможность использовать zlib (уровни сжатия 1-9) или zopfli (уровень сжатия 11) и несколько смягчает влияние времени на использование zopfli, разделяя сжатие больших файлов на несколько процессоров и ядер.

Марк Адлер
источник
113
В этом посте столько истории и информации, что я чувствую, что нужно добавить некоторые цитаты, если люди пытаются ссылаться на этот пост в качестве источника информации. Хотя, если эта информация будет отражена где-то в цитатах, таких как Википедия, ссылка на подобную цитируемую работу будет признательна.
ThorSummoner
1348
Я - ссылка, будучи частью всего этого. Этот пост может быть процитирован в Википедии как первоисточник.
Марк Адлер
524
К сведению: Марк Адлер - американский инженер-программист, активно участвующий в освоении космоса. Он наиболее известен своими работами в области сжатия данных как автор функции контрольной суммы Adler-32, а также соавтор библиотеки сжатия zlib и gzip. Он участвовал в работе Info-ZIP и участвовал в разработке формата изображений Portable Network Graphics (PNG). Адлер был также руководителем миссии Spirit Cruise для миссии Mars Exploration Rover. (Википедия)
Исаак Хансон
99
GZIP был создан, чтобы заменить Unix компресс. zip не превосходит tar + gzip в Unix по нескольким причинам. (Когда вы видите .tar.gzфайлы, это то, что они есть.) Во-первых, tar + gzip сжимает лучше, чем zip, поскольку при сжатии следующего файла может использоваться история из предыдущего файла (иногда его называют «сплошным» архивом). zip может сжимать файлы только индивидуально. Во-вторых, tar сохраняет всю информацию каталога Unix, тогда как zip не предназначен для этого. (Более поздние расширения в формате zip с дополнительными блоками, специфичными для Unix, пытаются решить эту проблему.)
Марк Адлер
85
Вы, кажется, путаете форматы с реализацией. 7-Zip реализация формата deflate может получить что-то вроде сжатия на 2-10% лучше, чем gzip с тем же форматом deflate (хотя для этого требуется гораздо больше процессорного времени). В 7z LZMA2 формат предложение по порядку 40% лучшего сжатия.
Марк Адлер
43

ZIP - это формат файла, используемый для хранения произвольного количества файлов и папок вместе со сжатием без потерь. Он не делает строгих предположений об используемых методах сжатия, но чаще всего используется с DEFLATE .

Gzip - это и алгоритм сжатия, основанный на DEFLATE, но менее обремененный потенциальными патентами и др., И формат файла для хранения одного сжатого файла. Он поддерживает сжатие произвольного количества файлов и папок в сочетании с tar . Полученный файл имеет расширение .tgzили .tar.gzи обычно называется тарболом .

zlib - это библиотека функций, инкапсулирующих DEFLATE в своем наиболее распространенном воплощении LZ77 .

Нильс Кеурентьес
источник
28

Самое важное отличие состоит в том, что gzip способен сжимать только один файл, тогда как zip сжимает несколько файлов один за другим и впоследствии архивирует их в один файл. Таким образом, gzip идет вместе с tar большую часть времени (хотя есть и другие возможности). Это сопровождается некоторыми (не) преимуществами.

Если у вас большой архив, и вам нужен только один файл из него, вам нужно распаковать весь файл gzip, чтобы добраться до этого файла. Это не требуется, если у вас есть ZIP-файл.

С другой стороны, если вы сжимаете 10 одинаковых или даже одинаковых файлов, zip-архив будет намного больше, потому что каждый файл сжимается индивидуально, тогда как в gzip в сочетании с tar сжимается один файл, что гораздо эффективнее, если файлы похож (равно).

Тим Циммерманн
источник
8
Вы преувеличиваете суть. Если бы люди хотели сжатые архивы с произвольным доступом, они могли бы создавать файлы ".gz.tar" вместо файлов ".tar.gz". Они не делают, потому что большинство людей не так заинтересованы в произвольном доступе. Существует большое сообщество по формату веб-архивирования .warc.gz, и им нужен произвольный доступ, поэтому они сжимают каждую веб-страницу отдельно. Вы используете этот формат каждый раз, когда просматриваете веб-страницу в Архиве Интернета.
Грег Линдал
2
«.gz.tar» не предлагает произвольный доступ, так как формат tar не может произвольно получить доступ к его записям. Вам нужно пройти все записи с начала, чтобы получить нужную конкретную запись, что еще хуже: вам нужно пройти все записи до конца, потому что один и тот же файл может быть заархивирован несколько раз (в нескольких версиях) в нескольких местах. в том же архиве - и нет способа выяснить это, кроме как прочитать всю запись в архиве по записи.
Мин Су Труффи