Новая версия 1.2.0, выложил
https://github.com/infval/StrikeLZSS,
сборка программы. По этому поводу больше не буду ничего делать, если будут проблемы, пишите, лучше в ЛС.
Изменения* Добавлено улучшенное сжатие по умолчанию. Отключается опцией -nu (not ultra
).
* Если размер в начале сжатого файла был 0x00000000, происходил вылет. Пустые файлы допускаются.
* Добавлена проверка на выход за пределы данных при распаковке. Происходит с неверными файлами.
* Точная проверка аргументов командной строки, раньше допускалось писать что угодно после первого символа, например -d и -d123 считалось одинаково.
* Если позиция при распаковке была между [0xFFFFFFFC, 0xFFFFFFFF], из-за переполнения допускалось выполнение дальше. Макс. размер входного файла всё равно меньше 2GB.
* Убрано ограничение на 16МБ распакованного файла, добавлял на случай ошибочных данных, так как для этих игр нет смысла в данных >= 65536 байт из-за ограничений памяти Mega Drive. Теперь если ОЗУ не хватит, то будет ошибка выделения памяти (malloc()).
* И по мелочи, связанное с кодом в основном.
КомпиляцияНе стал добавлять проект Visual Studio 2019, потому что можно просто создать новый пустой консольный C/C++ проект и добавить файл main.c. Я также: убирал добавление отладочной информации в Release сборки, чтобы не было абсолютного пути до проекта; делал статическую линковку, чтобы не было зависимости от DLL, но лучше так не делать и ставить Microsoft Visual C++ 2019 Redistributable Package.
Добавил простой Makefile, можно скомпилировать с помощью MinGW, если через MinGW-консоль ввести команду make.
Улучшенное сжатиеЯ говорил, что моё сжатие не должно быть хуже оригинала, но всё-таки у некоторых данных из Strike игр было хуже на 1 байт, но в остальных также или лучше.
С улучшенным сжатием хуже не должно быть, а сжатие улучшено где-то на 2%. Но это точно не лучший алгоритм, потому что повторное применение алгоритма давало результат на 1 байт меньше в двух местах, не стал так делать из-за мизерной пользы.
Обычное сжатие, в котором ищется всегда макс. последовательность - не лучший, иногда взятие меньше даёт улучшение. Я заметил, когда имеет смысл брать меньше, но не знаю почему это работает. Можно было изучить информацию по сжатию, но так не интересно.
Алгоритм SaxmanТа программа по случайности распаковывала шрифт, но дефис (48-й тайл) там был неправильный. После сжатия Saxman'ом, узнал, что размер "окна" 4096 (у нас 2048), а начальное смещение 0x0FDC (у нас 0x07EE). Из-за смещения близкого к концу "окна" шрифт получался почти правильно, но после распаковки больше 2048 байтов всё равно было бы неверно. В Saxman алгоритме предполагается, что "окно" уже заполнено нулями, экономии не так много и требует очищения памяти. И он может поставить в начале файла 2 байта (Little-Endian) - размер сжатых данных.