Я делаю упаковщик (сжатие во время выполнения) для изучения файла формата Windows PE. Я знаю некоторые алгоритмы сжатия данных, такие как RLE, LZW, Huffman-endoing и т. Д. Но какой алгоритм лучше всего сжимать двоичные данные. как файл .exe? Кто-нибудь может предложить, что лучше всего сжать двоичные данные?Кто-нибудь может предложить алгоритм бинарного сжатия?
ответ
Для стартера вы должны начать с LZ77 or LZ78 algorithm, которые предлагают неплохую степень сжатия и небольшой декомпрессионный шлейф (очевидно, что для пакера требуется небольшая декомпрессионная заглушка).
Следующим алгоритмом LZ7x является алгоритм LZMA, который предлагает (как правило) лучшее сжатие, чем LZ7x algortihms.
Если вы еще не писали упаковщик раньше, я предлагаю вам написать декомпрессионную заглушку в основном на языке низкого уровня (для этого используется язык де-факто) в стиле PIC (Position Independent Code) и только некоторые мелкие детали в сборке при необходимости. Это имеет преимущество, позволяя компилятору делать большую часть работы для вас противоречивых вещей (по крайней мере, точки 1 и 2):
- Декомпрессия окурок длина кода должна быть минимальной
- Скорость декомпрессионной заглушки код должен быть оптимальным
- использование памяти для компрессии и декомпрессии должны быть в разумных пределах
Вы можете настроить выходной узел для вашего удобства для хорошего компромисса между указанными точками.
После того, как у вас есть хорошее понимание теории сжатия, вы должны окончательно стремиться реализовать PAQ производный компрессор.
Есть несколько преимуществ по следуя Paq свинца:
Это знать, чтобы быть лучшим компрессор в нескольких областях (текст, изображение и исполняемый файл, хотя с другом контексте моделирования каждый раз). См. Различные контрольные показатели here и here.
Это с открытым исходным кодом (и следуйте лицензии GPL).
Попробуйте, прежде всего, выбрать вариант PAQ8PX для начала. Тем не менее, инъекция минимального (в длину) и быстрого декомпрессионного заглушки в результирующем сжатом PE-файле будет самой сложной частью работы.
Алгоритм PAQ также используется в kkrunchy хорошо известном PE-компрессоре группой даббрауш-демосцен. Хорошим взглядом на его внутренности является explained here.
В качестве последнего слова, если вы не привыкли к теории сжатия данных, я хотел бы предложить в качестве первого чтения, очень хорошего интро Data Compression Explained Мэтта Махони (автор PAQ) и вик книги о data compression theory ,
Имейте в виду, что сжатие всегда является компромиссом: лучший коэффициент сжатия - это не всегда то, что хотят конечные пользователи.Если вам требуется 256 ГБ памяти или подождите 5 минут или у вас есть декомпрессионный заглушка размером 10 МБ байт, это явно не правильный путь ...