Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

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

#zip #png #gzip #сжатие #zlib


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


Ответы

Ответ 1



tl;dr: zip — формат архивов, использующий, как правило, алгоритм Deflate для сжатия; zip-архив может содержать несколько файлов, которые сжимаются отдельно друг от друга. gzip сжимает ровно один файл (этим одним файлом может быть tar-архив) и тоже использует алгоритм Deflate. Библиотека zlib реализует Deflate и используется в zip, gzip, png и многих других приложениях. Формат zip был разработан Филом Кацем как открытый формат, но его реализация, PKZIP, была условно-бесплатной (shareware). В этом формате архива хранятся файлы и структура каталогов, и каждый файл сжимается независимо от других файлов. Файлы и структура каталогов также могут быть зашифрованы. Формат 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 добавлены относительно недавно и используются нечасто. Единственным широко распространённым методом является метод 8, Deflate и, в некоторой степени, метод 0, который просто хранит файлы без сжатия. Большинство zip-файлов, с которыми вы столкнётесь, будут использовать только методы 8 и 0. Стандарт 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. Утилита compress сжимала ровно один файл и добавляла к файлу расширение .Z. Она использовала алгоритм LZW, который в то время защищался патентами, что затрудняло его использование. Хотя некоторые конкретные реализации Deflate были запатентованы Филом Кацем, сам формат патентами не защищается, так что можно написать реализацию Deflate без нарушения патентов. Утилита gzip была задумана как прозрачная замена утилиты compress и фактически может распаковывать сжатые compressом данные. gzip при сжатии добавляет расширение .gz к имени файла. gzip использует формат сжатия Deflate, который позволяет сжимать немного лучше чем compress, быстро распаковывается и проверяет целостность данных с помощью CRC-32. Заголовок формата gzip также позволяет хранить исходное имя файла и время его изменения. Утилита compress сжимает ровно один файл, и для сжатия нескольких файлов с сохранением атрибутов и структуры каталогов обычно создавались архивы tar, которые затем сжимались с помощью compress для получения .tar.Z файла. Чтобы не сжимать всё вручную, утилита tar имела и до сих пор имеет опцию для автоматического включения сжатия с помощью compress; с появлением gzip также добавилась опция для включения gzip-сжатия и создания .tar.gz файлов. Архивы .tar.gz сжимаются лучше чем zip, так как файлы сжимаются не по отдельности и gzip имеет возможность эффективнее работать с избыточностью, особенно если в архиве много мелких файлов. .tar.gz широко распространён в Unix из-за его хорошей переносимости, но есть и более эффективные методы сжатия, так что могут встретиться архивы .tar.bz2 и .tar.xz. В отличие от .tar, .zip архивы хранят список файлов отдельно в конце файла. С учётом того, что каждый файл сжимается независимо, это позволяет прочитать отдельные файлы в архиве без распаковки всего архива целиком. А архив .tar должен быть распакован и прочитан целиком, чтобы даже просто увидеть список файлов в архиве, и это создаёт трудности в некоторых ситуациях. Вскоре после появления gzip, примерно в середине 1990-х годов, те же проблемы с патентами поставили под вопрос бесплатное использование формата изображений .gif, очень широко используемого на досках объявлений (BBS) и во всемирной паутине (WWW — новинка того времени). Так что небольшая группа создала PNG — формат изображений со сжатием без потерь — чтобы заменить GIF. PNG тоже использует формат Deflate для сжатия. Чтобы способствовать широкому использованию формата PNG, были созданы две свободные библиотеки: libpng реализует все функции формата PNG, а zlib предоставляет код сжатия и распаковки для использования в libpng и для других приложений. zlib был адаптирован из кода gzip. Все упомянутые патенты уже истекли. Библиотека zlib поддерживает Deflate, а также три обёртки (wrapping) для потоков Deflate. К ним относятся: отсутствие обёртки вообще («сырой» Deflate), обёртка zlib, который используется в блоках данных формата PNG, и обёртка gzip. Основное различие между обёртками zlib и gzip в том, что zlib-обёртка более компактна: всего 6 байт против как минимум 18 байт для gzip, а проверка целостности Adler-32 выполняется быстрее, чем CRC-32, который используется в gzip. Сырой метод Deflate используется программами, которые читают и записывают формат .zip, который по-своему работает с данными Deflate. Библиотека zlib используется очень широко в том числе в качестве реализации формата gzip; например, она используется в большинстве браузеров и веб-серверов для сжатия передаваемых в HTTP данных (при этом обычно используется формат gzip, так как с форматом zlib возникли некоторые исторические трудности). Разные реализации Deflate могут сжимать одни и те же данные с разной эффективностью, о чем свидетельствует наличие выбираемых уровней сжатия, которые позволяют выбирать между эффективностью сжатия и затраченным временем. zlib и PKZIP - не единственные реализации Deflate. 7-Zip или zopfli могут затратить очень много времени, чтобы сжать данные на несколько процентов эффективнее чем zlib. Утилита pigz, многопоточная реализация gzip, может использовать zlib (уровни сжатия 1-9) или zopfli (уровень сжатия 11) и несколько уменьшает затрачиваемое время с помощью сжатия больших файлов на нескольких ядрах процессора. Слегка вольный перевод ответа от Mark Adler на enSO с некоторыми дополнениями.

Комментариев нет:

Отправить комментарий