
Распаковка данных с помощью LZ-функций

Распаковка данных с помощью LZ-функций
В статьях о распаковке, опубликованным на этом сайте, мы рассмотрели уже несколько системных способов компрессии и декомпрессии данных. Сегодня разберем еще один. Это функции, появившиеся еще в ранних версиях Windows и использовавшиеся, в основном, в инсталляторах. Речь идет о LZ-функциях, в которых применяется алгоритм Lempel-Ziv, он же LZ77.
Суть всей движухи в том, что есть файлы, упакованные утилитой compress.exe, и есть утилиты и функции, которые эти упакованные файлы разворачивают в исходное состояние. Как я уже говорил, именно это используется в инсталляторах от Microsoft. Долгое время утилита compress.exe была доступна для скачивания на официальном сайте MS в составе Windows Server 2003 Resource Kit, но потом страница загрузки пропала. Не удивлюсь, если для скачивания надо без регистрации и СМС обновить систему до Windows 10. Шутка. К счастью, оригинальная копия дистрибутива пока еще доступна в интернет-архиве. Сторонники открытого ПО тоже не остались в стороне и нарисовали совместимый аналог, скачать его можно на офсайте. Последние на момент публикации статьи версии упаковщика и распаковщика находятся в прилагаемом архиве.
Что касается качества сжатия. На маленьких файлах степень компрессии находится где-то между плинтусом и канализацией, уступая в разы даже самопальным реализациям алгоритма LZ77. На больших файлах, особенно текстовых, ситуация заметно улучшается. Скорость обработки данных хорошая, тут придраться не к чему.
Переходим к практике. Сперва нам понадобится структура, которая используется для работы с упакованными файлами.
Code (Assembler) : Убрать нумерацию
- struct OFSTRUCT
- cBytes db ?
- fFixedDisk db ?
- nErrCode dw ?
- Reserved1 dw ?
- Reserved2 dw ?
- szPathName rb 128
- ends
Code (Assembler) : Убрать нумерацию
- ofs OFSTRUCT
- ...
- ...
- ; Открыть файл с упакованными данными
- invoke LZOpenFile,packed_file,ofs,OF_READ
- mov ebx,eax
- ; Прочитать и распаковать данные
- invoke LZRead,ebx,unpacked_data,[original_size]
- invoke LZClose,ebx
Code (Assembler) : Убрать нумерацию
- ; Открыть файл с упакованными данными
- invoke LZOpenFile,packed_file,ofs,OF_READ
- mov ebx,eax
- ; Создать файл-приемник
- invoke _lcreat,original_file,0
- mov esi,eax
- ; Прочитать, распаковать данные и записать их в новый файл
- invoke LZCopy,ebx,esi
- ; Закрыть файлы
- invoke LZClose,ebx
- invoke _lclose,esi
В приложении пример программы с исходным текстом, которая извлекает из файла иконку, упакованную по алгоритму LZ, и выводит ее на форму. Также в архиве утилиты для работы с упакованными файлами.
Просмотров: 936 | Комментариев: 0
Метки: Assembler, распаковка

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий
Заполните форму для добавления комментария
