Pull to refresh

Comments 11

Интересно, насколько алгоритм отличается от скажем ACE или bz2, особенно по уровню сжатия.


(Когда-то давно я думал, что сжатие выкидывает из бинарного потока нули, оставляя только единицы. Сейчас как вспомнил, стыдно стало)

Надо будет сравнить, да выложить в данной статье результаты.

о каком-то крутом сжатии речи тут не идёт, PP предоставлял не самый плохой уровень сжатия при относительно небольшом времени распаковки (на типичных амижных процессорах типа 68000 7Мгц или 68020 14Мгц). плюс значительная часть амижного ПО умела прозрачно работать с файлами упакованными PowerPacker, так что немало людей использовало его для большинства файлов, как нечто типа штатного сжатия виндовой файловой системы.

если же требовалось лучшее сжатие — использовали архиваторы, стандартом де-факто был LZX, алгоритм из которого (до сих пор?) используют майкрософты в своих инсталяторах.
  1. Какой конкретно метод сжатия в результате оказался?
  2. Не было бы проще взять только депакер и по нему восстановить формат сжатого файла, после чего заново написать пакер?
Алгоритм достаточно сложен для описания в одном только комментарии. Но я попробую:
— Используется два окна
— Используется хранение указателей (в случае Амиги 24-битные, я сделал равными битности компилятора) на найденные ранее максимальные последовательности
— Эти последовательности хранятся как значения в словаре, в котором ключами являются word-ы, прочитанные из входного файла

Написать пакер по анпакеру было бы слишком сложно и он бы не был таким же по силе сжатия (слабее).

Да, как там с размерностью? Т.е. есть ли стенка в 2 или 4 ГБ? И ещё, один файл на входе=один на выходе? Тогда сравнивать надо с мелкомягким expand

Если поменять `unsigned int`-ы на `size_t`, то будет и на 4-х работать, но алгоритм заведомо будет медленнее и менее производительнее чем, скажем, lzma.

Один файл на входе, один на выходе.

Если там реально обрезают указатели до 24 бит, то весьма печальный факт. Дело в том, что у семейства процов 68k изначально регистры и все адреса имеют логические 32 бита, и только в некоторых ранних процах адреса обрезаются до физичесикх 24 бит. Но даже в A500 или A600 можно вставить 'акселератор' — платку с более новым/быстрым процом и локальной памятью сильно больше 2^24 байт, после чего извраты с 24 битами там работать перестанут.


Далее, по алгоритму. Если я понял, то никаких хаффманов или арифм. сжатий нет, только LZ-подобный алгоритм, где словарь=предыдущие N байт распакованного файла. А значит, возможно построение оптимальной последовательности, которая обеспечит наилучшее возможное сжатие для данного формата (==алгоритма распаковки). Алгоритм Дейкстры вам в помощь.

Вам стоит всё же взглянуть на алгоритм самостоятельно, чтобы понять, используется там это уже, или нет.
Потому что что-то наподобие брутфорса там есть.
Также используется 0x200-байтный буфер, в который записываются получаемые токены. После заполнения буфера происходит запись в выходной поток, а буфер используется заново.
Sign up to leave a comment.

Articles