Открыть сервис

Библиотека minizip

Minizip — это легковесная библиотека с открытым исходным кодом, предназначенная для работы с ZIP-архивами. Она предоставляет программный интерфейс (API) для создания, чтения, модификации и извлечения файлов в формате ZIP, используя в качестве основы алгоритмы сжатия из библиотеки zlib. Minizip широко применяется в приложениях, где требуется встраиваемая поддержка ZIP без использования полноценных архиваторов или сторонних утилит.

История

Библиотека minizip была создана как часть экосистемы zlib, автором которой является Жан-Лу Гайи (Jean-loup Gailly) и Марк Адлер (Mark Adler). Первоначально minizip разрабатывался как пример использования zlib для работы с ZIP-архивами, но впоследствии стал самостоятельным проектом. Основная цель заключалась в предоставлении простого и эффективного способа упаковки и распаковки данных в формате ZIP, который является одним из самых распространённых форматов сжатия.

Развитие minizip происходило параллельно с zlib. В 2000-х годах библиотека была включена в состав многих операционных систем (например, в репозитории пакетов Linux) и стала основой для более сложных проектов, таких как libzip и Info-ZIP. В 2010-х годах minizip был форкнут и модифицирован сообществом разработчиков, что привело к появлению нескольких ответвлений, включая minizip-ng (next generation), который исправляет ошибки, добавляет поддержку шифрования AES и улучшает совместимость с современными стандартами.

Архитектура и устройство

Minizip состоит из набора C-файлов и заголовочных файлов, которые компилируются вместе с приложением. Основные компоненты библиотеки:

  • ioapi.h / ioapi.c — абстрактный слой ввода-вывода, позволяющий работать с файлами, памятью или пользовательскими потоками.
  • zip.h / zip.c — функции для создания и записи ZIP-архивов.
  • unzip.h / unzip.c — функции для чтения и извлечения ZIP-архивов.
  • crypt.h / crypt.c — поддержка шифрования (традиционное ZIP 2.0 и, в некоторых версиях, AES).

Библиотека не требует внешних зависимостей, кроме zlib, которая обеспечивает алгоритмы сжатия Deflate. Minizip также может использовать другие алгоритмы, такие как BZIP2 или LZMA, если они включены при сборке.

Ключевые возможности

  • Создание архивов: добавление файлов, каталогов, установка комментариев и метаданных.
  • Извлечение данных: чтение содержимого, извлечение отдельных файлов или всех файлов архива.
  • Поддержка потоков: возможность работы с архивами, расположенными в памяти или в сетевых потоках.
  • Шифрование: поддержка парольной защиты (алгоритм PKWARE 2.0, в некоторых версиях — AES-256).
  • Кроссплатформенность: работает на Windows, Linux, macOS, FreeBSD и других POSIX-системах.
  • Лёгкость: размер библиотеки составляет несколько десятков килобайт в скомпилированном виде.

Применение

Minizip используется в самых разных областях, где требуется встраиваемая работа с ZIP-архивами:

  • Мобильные приложения: многие игры и утилиты для Android и iOS используют minizip для упаковки ресурсов (текстур, звуков, конфигураций).
  • Встраиваемые системы: в устройствах с ограниченными ресурсами (роутеры, IoT-датчики) minizip позволяет распаковывать обновления прошивок.
  • Игровые движки: например, в движке Godot используется minizip для работы с архивами ресурсов.
  • Научные и инженерные программы: для сжатия больших объёмов данных (например, в геоинформационных системах).
  • Утилиты командной строки: многие программы, такие как 7-Zip (частично) или p7zip, используют minizip в качестве одной из опций.

Minizip-ng

Minizip-ng (next generation) — это форк оригинальной библиотеки, активно развивающийся с 2016 года. Основные отличия от классической версии:

  • Исправление множества уязвимостей (переполнение буфера, утечки памяти).
  • Поддержка современных алгоритмов сжатия (BZIP2, LZMA, ZSTD).
  • Полноценная поддержка шифрования AES-256.
  • Улучшенная совместимость с ZIP-архивами, созданными в Windows и macOS.
  • API, более удобный для многопоточного использования.

Minizip-ng распространяется под лицензией zlib/libpng, что разрешает использование в коммерческих проектах без ограничений.

Сравнение с аналогами

БиблиотекаРазмерПоддержка AESМногопоточностьЛицензия
minizip~50 КБЧастичноНетzlib
minizip-ng~70 КБДа (AES-256)Даzlib
libzip~150 КБДа (AES-128)ДаBSD
7-Zip SDK~1 МБДа (AES-256)ДаLGPL

Minizip выигрывает в простоте и минимальном размере, но уступает в функциональности более тяжёлым аналогам.

Критика и ограничения

  • Отсутствие поддержки многотомных архивов (split archives).
  • Ограниченная обработка Unicode: в классической версии имена файлов в кодировке UTF-8 могут обрабатываться некорректно.
  • Слабая защита от повреждений: библиотека не имеет встроенных механизмов восстановления данных.
  • Устаревший API: некоторые функции не соответствуют современным стандартам безопасности (например, использование sprintf без контроля длины строки).

Эти недостатки частично устранены в minizip-ng, но для критически важных приложений рекомендуется использовать более современные библиотеки, такие как libzip или 7-Zip SDK.

Интересные факты

  • Minizip используется в ядре операционной системы Android для распаковки ресурсов приложений (APK-файлов).
  • Библиотека входит в состав многих дистрибутивов Linux (например, в пакет minizip в Ubuntu и Fedora).
  • Исходный код minizip настолько компактен, что его часто включают непосредственно в проекты (статическая линковка) без отдельной компиляции.

Источники

  • Официальный репозиторий minizip на GitHub (проект zlib).
  • Документация zlib: «zlib 1.2.13 Manual» (2023).
  • Сравнительный анализ библиотек для работы с ZIP-архивами (статья в журнале «Linux Journal», 2021).
  • Репозиторий minizip-ng: «nmoinvaz/minizip» (GitHub).
  • Стандарт PKWARE ZIP Appnote (версия 6.3.10, 2022).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →