15.01.2006
Данный докумен обобщенно описывает структуру архивов в формате 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 по распакованным данным. |
Исходник, реализующий сжатие файлов в подобный архив.