![]() |
Добро пожаловать, гость ( Вход | Регистрация )
![]() |
-=CHE@TER=- |
![]()
Сообщение
#1
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,360 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 313 раз(а) ![]() |
Delphi programs in API.
На английском. Очень подробно всё описано, плюс есть исходные коды готовых юнитов. Например SmallUtil, в котором есть все частоиспользуемые подпрограммы, и который в размере меньше, чем SysUtils (автор так утверждает - я не проверял). |
![]() ![]() |
-=CHE@TER=- |
![]()
Сообщение
#2
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,360 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 313 раз(а) ![]() |
Натолкнулся на то, что в нескольких играх используется LZSS, описанный в моём сообщении выше.
Но, есть одно отличие MS-LZSS (Microsoft LZSS) от классического LZSS (который, похоже, используется во многих играх), без которого на выходе получится не файл, а что попало. Итак, строчки из MS-LZSS: CODE FillChar(buff[0], $FFF + 1, 32); I:=($FFF + 1) - 16; в классическом LZSS должны выглядеть вот так: CODE FillChar(buff[0], $FFF + 1, 0); I:=($FFF + 1) - 16 - 2; Т.е. кольцевой буфер заполняется нулём, а не пробелом (походу изначально MS жали текстовые файлы, вот пробелом (32) и заполняли), а также отступ от начала буфера должен быть $FEE (поэтому ещё "-2" добавляется). Ещё хочу заметить, что сжатые этим алгоритмом данные очень хорошо выявляются "на глаз": CODE _FORMMIDI_1234LIST_... Где "_" - это символ $FF (255), так как в начале файлов ещё нет повторений, то первые блоки по 8 байт идут в упаковонный поток без изменений. В общем, если в файле видны блоки по 9 байт, первый из которых $FF (и, собственно, с $FF файл и начинается), то с большой долей вероятности можно утверждать, что файл ужат классическим LZSS. В некоторых совсем уж старых играх буфер может быть не 4Кб, а 1Кб, но это не так сложно подобрать опытным путём. Спасибо сказали:
|
![]() ![]() |
Упрощённая версия | Сейчас: 21st August 2024 - 12:34 |