Миниатюрные библиотеки для компрессии - miniz и minilzo

Для эмулятора Радио-86РК на Maximite мне потребовалась библиотека для сжатия. У меня там есть виртуальный ROM-диск, а так как файлов порядочно, около мегабайта в сумме, и так как у PIC32 только 512Кб флэша, я решил попробовать сжать данные в процессе сборки бинаря и разжимать их налету уже внутри PIC’а.

Итак, требования к библиотеке:

  • одиночный исходник без зависимостей
  • использование для декомпрессии только статической памяти небольшого и фиксированного размера (никаких глупостей типа malloc/calloc)
  • ANSI C (надо собирать микрочиповским компилятором XC32)

Нашлось два кандидата:

  • miniz (реализует алгоритмы zlib и deflate)
  • minilzo (реализует алгоритм LZO)

Обе библиотеки собрались без сучка и задоринки. miniz дает на моих данных 0.78 сжатия, minilzo - 0.71. Оба не дают вместить все в 512К.

В целом мне miniz понравился больше с точки зрения функциональности. К тому же эта библиотека вообще не требует дополнительной памяти для декомпрессии, а использует только выходной буфер. Для minilzo требуется статический буфер на 16Кб.

P.S. Попробовал я еще XZ Embedded (LZMA2). Там, вроде по экспериментам получалось сжать гораздо сильнее, но там требуется интерфейс malloc/free, поэтому сходу собрать под PIC32 не получилось.


Disclaimer

Комментарии