7-Zip — популярный архиватор и инструмент сжатия файлов, который использует собственный формат архива, известный как формат 7z. Разработанный Игорем Павловым, формат 7z был создан для обеспечения высокой степени сжатия, надежного шифрования и поддержки нескольких методов сжатия. В этом техническом объяснении будут подробно рассмотрены детали формата архива 7z, его структура и различные методы сжатия и шифрования, которые он использует.
Формат 7z представляет собой контейнер, который может хранить несколько файлов и каталогов вместе с их метаданными в одном архивном файле. Он поддерживает сплошное сжатие, которое позволяет сжимать несколько файлов вместе, что приводит к лучшей общей степени сжатия. Формат также включает такие функции, как сжатие заголовка, многопоточность и возможность разделения архивов на несколько томов.
Структура архива 7z состоит из трех основных частей: заголовок подписи, заголовок и блоки сжатых данных. Заголовок подписи — это 6-байтовая последовательность, которая идентифицирует файл как архив 7z. Он всегда начинается с байтов «7z\xBC\xAF\x27\x1C». Заголовок следует за подписью и содержит важную информацию об архиве, такую как версия, количество файлов и используемые методы сжатия.
Заголовок разделен на несколько подчастей, включая свойства архива, информацию о потоке и информацию о файле. Свойства архива хранят общую информацию об архиве, такую как количество файлов и время создания. Информация о потоке содержит сведения о блоках сжатых данных, такие как их размер и используемые методы сжатия. Информация о файле хранит метаданные для каждого файла в архиве, включая имя файла, размер и атрибуты.
Одной из ключевых особенностей формата 7z является его поддержка нескольких методов сжатия. Наиболее распространенными методами, используемыми в архивах 7z, являются LZMA (алгоритм цепи Маркова Лемпеля-Зива) и LZMA2. LZMA — это высокопроизводительный алгоритм сжатия, который обеспечивает отличную степень сжатия, особенно для текстовых и исполняемых файлов. LZMA2 — это улучшенная версия LZMA, которая предлагает лучшую поддержку многопоточности и более высокую скорость распаковки.
Помимо LZMA и LZMA2, формат 7z также поддерживает другие методы сжатия, такие как BZip2, PPMd и Delta. BZip2 — это универсальный алгоритм сжатия, который обеспечивает хорошую степень сжатия для широкого спектра типов файлов. PPMd — это статистический метод сжатия, который хорошо подходит для текстовых файлов и может достигать очень высокой степени сжатия. Сжатие Delta используется для хранения различий между похожими файлами, что может значительно уменьшить размер архива при хранении нескольких версий одного и того же файла.
Формат 7z также включает в себя надежные возможности шифрования для защиты содержимого архива. Он поддерживает алгоритм шифрования AES-256, который считается одним из самых надежных доступных методов шифрования. Когда архив зашифрован, все имена файлов, метаданные и блоки сжатых данных защищены, что делает практически невозможным для неавторизованных пользователей доступ к содержимому архива без правильного пароля.
Для обеспечения целостности данных формат 7z использует комбинацию циклической проверки избыточности (CRC) и хэш-значений SHA-256. Каждый блок сжатых данных имеет значение CRC, которое используется для обнаружения и исправления ошибок во время распаковки. Кроме того, заголовок архива и метаданные файла защищены хэш-значениями SHA-256, которые можно использовать для проверки целостности архива и его содержимого.
Формат 7z также поддерживает создание самораспаковывающихся архивов (SFX). Архив SFX — это исполняемый файл, который включает сжатые данные и необходимый код извлечения. При запуске архив SFX автоматически извлекает содержимое в указанное местоположение без необходимости какого-либо дополнительного программного обеспечения. Эта функция упрощает распространение сжатых файлов среди пользователей, у которых может не быть установленного совместимого инструмента извлечения.
Одним из преимуществ формата 7z является его открытая архитектура, которая позволяет разработчикам создавать совместимые инструменты и библиотеки. Само программное обеспечение 7-Zip является открытым исходным кодом, а его исходный код доступен в соответствии с GNU Lesser General Public License (LGPL). Это привело к разработке различных сторонних инструментов и плагинов, которые могут созда вать, извлекать и обрабатывать архивы 7z.
В заключение, формат архива 7z представляет собой мощный и универсальный контейнер сжатия, который обеспечивает высокую степень сжатия, надежное шифрование и поддержку нескольких методов сжатия. Его расширенные функции, такие как сплошное сжатие, многопоточность и самораспаковывающиеся архивы, делают его привлекательным выбором как для отдельных пользователей, так и для корпоративных сред. По мере того как формат продолжает развиваться и совершенствоваться, он, вероятно, останется популярным выбором для сжатия и архивирования файлов.
Сжатие файлов уменьшает избыточность, чтобы те же данные занимали меньше бит. Верхняя граница задаётся теорией информации: для без потерь пределом является энтропия источника (см. теорему кодирования источника Шеннона source coding theorem и его оригинальную статью 1948 года «A Mathematical Theory of Communication»). Для сжатия с потерями компромисс между битрейтом и качеством о писывает теория rate–distortion.
Большинство компрессоров работают в два этапа. Сначала модель предсказывает или выявляет структуру данных. Затем кодер превращает эти предсказания в почти оптимальные шаблоны битов. Классическая семья моделей — Lempel–Ziv LZ77 (1977) и LZ78 (1978) находят повторяющиеся подстроки и излучают ссылки вместо сырых байтов. На стороне кодирования кодирование Хаффмана (см. статью 1952 года) назначает более короткие коды вероятным символам. Арифметическое кодирование и range coding ещё точнее приближаются к пределу энтропии, а современные Asymmetric Numeral Systems (ANS) дают схожие коэффициенты при табличных реализациях.
DEFLATE (используют gzip, zlib, ZIP) сочетает LZ77 и Хаффмана. Спецификации открыты: DEFLATE RFC 1951, оболочка zlib RFC 1950и формат gzip RFC 1952. Gzip ориентирован на потоковую передачу и явно не обеспечивает произвольный доступ. PNG закрепляет DEFLATE как единственный метод (окно до 32 КиБ) согласно спецификации «Compression method 0…» и W3C/ISO PNG 2nd Edition.
Zstandard (zstd): современный универсальный компрессор с высокими коэффициентами и очень быстрой декомпрессией. Формат описан в RFC 8878 (и HTML-зеркале) и в референс-спеке на GitHub. Как и gzip, базовый фрейм не предполагает произвольного доступа. Главное преимущество zstd — словари: маленькие образцы корпуса, резко улучшающие сжатие множества крошечных или похожих файлов (см.документацию словарей python-zstandard и пример Nigela Tao). Реализации принимают «unstructured» и «structured» словари (обсуждение).
Brotli: оптимизирован для веб-контента (WOFF2, HTTP). Совмещает статический словарь и DEFLATE-подобное ядро LZ+энтропия. Спецификация — RFC 7932, где указано окно 2WBITS−16 с WBITS в [10, 24] и то, что формат не предоставляет произвольный доступ. Brotli часто превосходит gzip на веб-тексте и быстро декодируется.
Контейнер ZIP: ZIP — файловый архив, поддерживающий разные методы (deflate, store, zstd и др.). Де-факто стандарт — APPNOTE PKWARE (см.портал APPNOTE, размещённую копиюи обзоры LC ZIP File Format (PKWARE) / ZIP 6.3.3).
LZ4 ориентирован на максимальную скорость при умеренных коэффициентах. См. страницу проекта и формат фреймов. Подходит для кэшей в памяти, телеметрии и горячих путей, где декомпрессия должна быть почти со скоростью RAM.
XZ / LZMA гнётся за плотностью (высоким коэффициентом), но компрессует медленнее. XZ — контейнер; основную работу делают LZMA/LZMA2 (моделирование наподобие LZ77 + range coding). См.формат .xz,