15.01.2006

Структура LZH архива.

Введение.

Данный докумен обобщенно описывает структуру архивов в формате LZH. На данный момент этот формат не имеет большего практического значения, однако, по данным автора, он еще применяется в некоторых мобильных устройствах. Также авхивы данного класса предполагают несколько вариаций собственно алгоритма сжатия - здесь будет упомянут самый простой вариант LZ77 со словарем 4кб + адаптивное кодирование Хаффмана.

Структура архива.

Архив состоит из последовательности однотипных элементов, типа

Заголовок1
Сжатые данные
Заголовок2
Сжатые данные
и т.д.

Заголовок определяет границы следующего непосредственно за ним потока сжатых данных и тип алгоритма сформировавшего поток.

Структура заголовка.

Смещение Тип Значение
00 uint8 HeadSize. Размер заголовка исключая первые 2 байта.
01 uint8 HeadChk. Контрольная сумма заголовка. Вычисляется как младший байт суммы всех байтов заголовка начиная со смещения 02.
02 Char[5] HeadID. Идентификатор типа архива. Имеет вид "-lhX-", где Х определяет тип алгоритма сжатия.
0 - простая копия данных
1 - LZ77+Хаффман, упоминаемый здесь.
Есть и другие значения, но они не будут здесь рассматриваться.
07  int32 PackSize. Размер следующего за заголовком упакованного потока.
0B int32 OrigSize. Размер данных в распакованном виде
0F int32 FileTime. Время изменения файла.
13 uint16 Attr. Атрибуты файла.
15 uint8 Len. Длина имени файла.
16 Char[Len] FileName. Имя файла.
16+Len uint16 crc16. Контрольная сумма, вычисленная классическим алгоритмом crc16 по распакованным данным.

Исходник, реализующий сжатие файлов в подобный архив.

Hosted by uCoz