Кто-нибудь может предложить алгоритм двоичного сжатия?

Я делаю упаковщик (сжатие во время выполнения) для изучения файла формата Windows PE. Я знаю некоторые алгоритмы сжатия данных, такие как RLE, LZW, Huffman-endoing и т. Д. Но какой алгоритм лучше всего сжимает двоичные данные. точно так же, как файл .exe? Кто-нибудь может предложить, что лучше всего для сжатия двоичных данных?


person knolz    schedule 02.01.2016    source источник


Ответы (1)


Для начала вам следует начать с алгоритмов LZ77 или LZ78, которые предлагают неплохую степень сжатия и небольшой декомпрессионный патрубок (очевидно, наличие небольшого декомпрессионного патрубка обязательно для пакера).

За алгоритмом LZ7x следует алгоритм LZMA, который предлагает (обычно) лучшее сжатие, чем у алгоритмов LZ7x.

Если вы никогда раньше не писали упаковщик, я предлагаю вам написать заглушку декомпрессии в основном на языке низкого уровня (для этого фактическим языком является C) в PIC (Position-Independent Code) и, при необходимости, лишь некоторые мелкие детали на языке ассемблера. Это имеет то преимущество, что позволяет компилятору делать большую часть работы за вас для противоречивых вещей (по крайней мере, пункты 1 и 2):

  1. Длина кода заглушки декомпрессии должна быть минимальной.
  2. Скорость кода заглушки декомпрессии должна быть оптимальной.
  3. Использование памяти для сжатия и распаковки должно быть в разумных пределах.

Затем вы можете настроить выходную сборку для вашего удобства, чтобы найти хороший компромисс между вышеуказанными пунктами.


Когда вы хорошо разбираетесь в теории сжатия, вам следует окончательно попытаться реализовать компрессор, производный от PAQ.

Следование за лидерством в PAQ дает множество преимуществ:

  • Известно, что это лучший компрессор для нескольких полей (текст, изображение и исполняемый файл, хотя каждый раз с разным контекстом моделирования). См. Различные тесты здесь и здесь.

  • Это открытый исходный код (и соответствует лицензии GPL).

Постарайтесь для начала особенно внимательно следить за вариантом PAQ8PX. Однако внедрение минимальной (по длине) и быстрой заглушки декомпрессии в полученный сжатый PE-файл будет самой сложной частью работы.

Алгоритм PAQ также используется в kkrunchy, хорошо известном компрессоре PE, созданном демосценой farbrausch. Хороший взгляд на его внутреннее устройство можно найти здесь .


В заключение, если вы не знакомы с теорией сжатия данных, я бы предложил в качестве первого прочтения очень хорошее вступление Объяснение сжатия данных Мэтта Махони (автора PAQ) и вики-книги о сжатии данных теория.

Имейте в виду, что сжатие - это всегда компромисс: конечные пользователи не всегда хотят наилучшего коэффициента сжатия. Если вам нужно 256 ГБ памяти, или вы ждете 5 минут, или у вас есть декомпрессионная заглушка размером 10 МБ для распаковки, это явно не правильный путь ...

person Neitsa    schedule 02.01.2016