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

Алгоритм сжатия PalmDoc

Алгоритм сжатия PalmDoc — это метод сжатия данных без потерь, основанный на алгоритме LZ77, который использовался для уменьшения объёма текстовых файлов (в первую очередь книг и документов) в операционной системе Palm OS. Алгоритм был разработан компанией Palm, Inc. для устройств на базе Palm OS и стал стандартом де-факто для хранения электронных книг на платформе Palm. Отличается простотой реализации и высокой скоростью декомпрессии, что было критично для ограниченных вычислительных ресурсов КПК (карманных персональных компьютеров) конца 1990-х — начала 2000-х годов.

История

Алгоритм PalmDoc был создан в середине 1990-х годов как часть экосистемы Palm OS. Основной задачей было обеспечить возможность хранения больших объёмов текстовой информации (например, книг, справочников, документации) на устройствах с крайне ограниченной памятью — типичные КПК того времени имели от 2 до 8 МБ оперативной памяти. Использование сжатия позволяло увеличить эффективный объём хранимых текстов в 2–4 раза.

PalmDoc стал основным форматом для программ чтения электронных книг на Palm OS, таких как AportisDoc (позже — Palm Reader), TealDoc и других. Он также использовался для сжатия системных файлов и текстовых баз данных (Palm Database — PDB). С упадком платформы Palm OS в середине 2000-х годов алгоритм утратил массовое распространение, однако его реализация сохранилась в некоторых конвертерах и эмуляторах.

Принцип работы

Алгоритм PalmDoc является вариантом алгоритма LZ77, адаптированным для сжатия текста. Он использует скользящее окно и кодирование повторяющихся последовательностей символов.

Основные компоненты

Процесс сжатия

  1. Алгоритм последовательно обрабатывает входные данные, начиная с первого байта.
  2. Для каждого текущего положения (позиции) в данных алгоритм ищет в окне (предыдущие 4096 байт) самую длинную последовательность, совпадающую с текущей.
  3. Если найдено совпадение длиной 3 байта или более, оно кодируется парой: смещение (расстояние от текущей позиции до начала совпадения в окне) и длина совпадения.
  4. Если совпадение не найдено или его длина меньше 3 байт, текущий байт копируется в выходной поток как литерал (незакодированный байт).

Структура сжатых данных

Сжатые данные состоят из последовательности токенов. Каждый токен может быть либо литералом (один байт), либо ссылкой на совпадение (пара «смещение, длина»). Для различения типов токенов используется битовый флаг:

Таким образом, ссылка на совпадение всегда занимает 2 байта (16 бит), а литерал — 1 байт плюс 1 бит флага. Эффективность сжатия достигается за счёт того, что ссылки заменяют длинные повторяющиеся последовательности (от 3 до 256 байт) всего двумя байтами.

Процесс декомпрессии

Декомпрессия выполняется быстро и просто:

  1. Алгоритм последовательно читает битовые флаги.
  2. Если флаг 0 — читается следующий байт как литерал и записывается в выходной поток.
  3. Если флаг 1 — читаются 2 байта, из которых извлекаются смещение (12 бит) и длина (4 бита). Затем из уже декомпрессированных данных (в пределах окна) копируется последовательность указанной длины, начиная с позиции, отстоящей на смещение назад.
  4. Процесс повторяется до конца сжатых данных.

Формат файла PalmDoc

Данные, сжатые алгоритмом PalmDoc, обычно хранятся в файлах формата Palm Database (PDB). Структура такого файла включает:

Сжатые записи содержат заголовок, указывающий на тип сжатия (PalmDoc), и собственно сжатые данные.

Характеристики

Применение

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

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

Источники

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

На главную BFOmetr →