Упаковка и распаковка данных с помощью Delta-функций
Упаковка и распаковка данных с помощью Delta-функций
В комментариях к предыдущей статье подсказали (DRON, спасибо!) еще один вариант компрессии данных, выполняемый штатными средствами системы. Речь идет о технологии Delta Compression, которая используется в первую очередь в обновлениях Windows. Суть этой технологии заключается в том, что берутся два массива информации, будь то файлы или блоки в памяти. Между ними определяются все различия, после применения которых из первого массива получается второй, такие различия называются "дельтой". Затем информация о дельте тщательно упаковывается высокоэффективными алгоритмами, а из упакованных блоков в дальнейшем формируются патчи. Delta Compression доступна в Windows Vista и более новых системах.
Как сжать произвольные данные с помощью Delta-функций? Если взять массив данных и вычислить разницу между ним и "пустым местом", то на выходе мы получим упакованную дельту, которая при применении патча даст в точности исходные данные. Именно это нам и требуется.
Для упаковки данных заполняем структуру DELTA_INPUT, в которую записываем указатель на эти данные и их размер. В качестве источника указываем "пустое место", то есть незаполненную структуру DELTA_INPUT. Затем вызываем функцию CreateDeltaB. Но сперва надо описать нужные структуры и определить константы, которые не знает FASM.
Code (Assembler) : Убрать нумерацию
- DELTA_FLAG_NONE = 0x00000000
- DELTA_FILE_TYPE_RAW = 0x00000001
- struct DELTA_INPUT
- lpStart dd ?
- uSize dd ?
- Editable dd ?
- ends
- struct DELTA_OUTPUT
- lpStart dd ?
- uSize dd ?
- ends
Code (Assembler) : Убрать нумерацию
- ; lpDelta
- push diDelta
- ; HashAlgId
- push 0
- ; lpTargetFileTime
- push NULL
- ; Empty DELTA_INPUT
- push 0
- push 0
- push 0
- ; Empty DELTA_INPUT
- push 0
- push 0
- push 0
- ; Empty DELTA_INPUT
- push 0
- push 0
- push 0
- ; Target
- push 0
- ; Размер исходных данных
- push [fsize]
- ; Указатель на исходные данные
- push [dMem]
- ; Source
- push 0
- push 0
- push 0
- ; ResetFlags
- push 0
- push DELTA_FLAG_NONE
- ; SetFlags
- push 0
- push DELTA_FLAG_NONE
- ; FileTypeSet
- push 0
- push DELTA_FILE_TYPE_RAW
- ; Сжать данные
- invoke CreateDeltaB
Code (Assembler) : Убрать нумерацию
- ; Сжать данные
- push diDelta
- push 12
- pop ecx
- @@:
- push 0
- loop @b
- ; Размер исходных данных
- push [fsize]
- ; Указатель на исходные данные
- push [dMem]
- mov cl,8
- @@:
- push 0
- loop @b
- push DELTA_FILE_TYPE_RAW
- invoke CreateDeltaB
Распаковка выполняется еще проще. Заполняем структуру DELTA_INPUT указателем на сжатые данные и их размером, после этого вызываем функцию ApplyDeltaB. Резервировать память для распакованных данных не требуется, это сделает система. Сохранять размер исходных данных тоже не надо, разве что для каких-то ваших внутренних целей. При распаковке система определяет размер данных самостоятельно.
Code (Assembler) : Убрать нумерацию
- ; lpDelta
- push diTarget
- ; Source
- push 0
- push xlen
- push xdata
- ; Empty DELTA_INPUT
- push 0
- push 0
- push 0
- ; ApplyFlags
- push 0
- push DELTA_FLAG_NONE
- ; Распаковать данные
- invoke ApplyDeltaB
Плюсы использования Delta-функций очевидны. Отличная степень сжатия, особенно на файлах большого размера, простота реализации, а главное, не надо выделять дополнительную память под упакованные и распакованные данные, все это сделает система. Что касается недостатков, то, как я уже сказал в начале статьи, Delta-функции доступны только в Windows Vista и выше, именно так написано в официальной документации. Но при этом библиотека msdelta.dll в Windows XP имеется, а описанные в статье функции упаковки и распаковки, соответственно, работают. Ошибка ли это в документации, и насколько полно реализована поддержка Delta Compression в Windows XP, этого я сказать не могу.
В приложении примеры программ с исходными текстами. Это простейший упаковщик данных, работающий через командную строку, и программа, которая извлекает из памяти иконку с помощью штатных Delta-функций, а затем выводит ее на форму.
Просмотров: 1269 | Комментариев: 5
Метки: Assembler, распаковка
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Petya
(14.06.2021 в 14:46):
Несколько не по теме, но в общий ещё оффтопичней.
1) Цикл функций упаковки/распаковки закончен, или у Вас ещё планы есть?
2) Inflate будете расписывать?
1) Цикл функций упаковки/распаковки закончен, или у Вас ещё планы есть?
2) Inflate будете расписывать?
ManHunter
(11.04.2021 в 12:37):
Ну так напиши распаковщик, вот он и будет.
voffka, спасибо за тестирование, подкорректировал статью.
voffka, спасибо за тестирование, подкорректировал статью.
:(
(11.04.2021 в 07:56):
А где же простейший распаковщик данных, работающий через командную строку?
voffka
(11.04.2021 в 04:05):
На Windows XP оба примера работают. Так что ХР тоже поддерживается.
Добавить комментарий
Заполните форму для добавления комментария
Нет