Описание: Разбор алгоритма LZSS |
Поиск в теме | Версия для печати |
TrickZter |
Отправлено: 03 Февраля, 2016 - 06:15:40
|
Покинул форум
Сообщений всего: 560
Дата рег-ции: Июнь 2015
|
TrickZter
Цитата:Вот ещё что хотел спросить: для распаковщика входными данными является путь к рому, начало блока графика и конец блока графики. Правильно ли это?
А как ты конец нашёл? Проще всего реализовать программу, если в качестве входных данных дать: 1) имя файла, 2) координату начала запакованных данных, 3) размер данных, которые хотим получить на выходе.
Если не задать размер, то алгоритм позволяет "распаковывать" всё подряд - хоть до конца рома, и на выходе ты получишь распакованную картинку плюс СОТНИ хлама, следующие за ней.
Цитата:или можно как-то программно определять алгоритм сжатия и не задавать начального и конечного значений блоков графики?
С точки зрения реализации гораздо проще указать программе все данные самому. Хотя используя различные методы программу можно научить находить что-то похожее на пожатые ресурсы, но гарантий никаких нет, ведь практически любую последовательность байтов можно попытаться так или иначе "распаковать" и получить на выходе бесполезный мусор.
Если ошибиться с началом картинки, то даже запакованная картинка может превратиться во что-то мусоро-подобное. Представь, например, что за флаговый байт мы взяли не первый байт пожатой картинки, а байт перед ней или второй байт пожатой картинки. Даже из-за такой небольшой ошибки программа будет воспринимать данные совсем иначе: то, что должно быть не пожатым байтом, может восприниматься программой как часть пары сжатия, а то, что было частью пары сжатия, будет восприниматься как не пожатый байт. В итоге "распакованная" картинка превратится в месево, в котором, если повезёт, где-нибудь под конец и появится что-то похожее на конец картинки (если на каком-то этапе программа верно попадёт во флаговый байт). |
|
|
Ace Lightning |
Отправлено: 03 Февраля, 2016 - 06:17:14
|
VIP
Покинул форум
Сообщений всего: 480
Дата рег-ции: Июнь 2015
|
Ace Lightning
Если есть у кого время, помогите перевести предложение, выделенное жирным. А то что-то никак не могу правильно понять весь его смысл:
Dracula:
You have done well, my girl. In fact, you are the first human who has come this far. You have my praise.
Sonia:
You are the Prince of Darkness. Because of you many people have died, many people have suffered.
Dracula:
Oh no, my dear. have merely done what you humans wished for, fulfilling your insatiable desires.
Sonia:
People must fulfill their dreams with their own power. You who have been consumed by the power of evil no longer have the strength to determine your own fate!
Dracula:
Silence! On the contrary, I am just the one to use this power, and I will be the king who rules over the entire world. Give yourself to me, young lady. There may be merit in having your power, in having your presence.
Sonia:
My strength will only be used to protect the world! Lord of Darkness, prepare to suffer for trifling with so many lives!
Dracula:
As you wish, girl. Then it is your fate to kneel before my power! |
|
|
Ace Lightning |
Отправлено: 03 Февраля, 2016 - 06:19:34
|
VIP
Покинул форум
Сообщений всего: 480
Дата рег-ции: Июнь 2015
|
Ace Lightning
У меня снова проблемы с алгоритмом сжатия...
Хотелось бы вернуться на несколько страниц назад в теме..
CODE:AA 55 55 AA AA 55 55 AA AA 55 55 AA AA 55 55 AA
AA 55 55 AA 94 7E
94 указывает на AA, и начиная с него копируем 33 байта. Так вот он мне распакует данные вот так:
CODE:AA 55 55 AA AA 55 55 AA AA 55 55 AA AA 55 55 AA AA 55 55 AA AA 55 55 AA AA 55 55 AA AA 55 55 AA AA 55 55 AA AA
А для того, чтобы была последовательность вида:
CODE:AA 55 55 AA AA 55 55 AA AA 55 55 AA AA 55 55 AA
Мне нужно скопировать не 33 байта, а 12 байт..((
Так же у меня есть последовательность:
CODE:4A 4A 03 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF C1 7F 40
а вот запакованная (жирным выделены флаговые байты)
4A E7 4A 03 03 E4 63 00 05 FF C1 7F FF 40
Байт E7 показывает нам, что выделенные курсивом 4 байта отвечают за сжатие последовательности нулей. Но вот почему 4 байта??
E463 указывает на байт 00, который был до этой последовательности, и он копируется 6 раз. Дальше 0005 указывает на байт 03, который так же был до этой последовательности и он копируется 8 раз. Не могу понять почему так... (((
заранее прошу прощения, что я такой непонятливый... |
|
|
TrickZter |
Отправлено: 03 Февраля, 2016 - 06:19:59
|
Покинул форум
Сообщений всего: 560
Дата рег-ции: Июнь 2015
|
TrickZter
Цитата:Мне нужно скопировать не 33 байта, а 12 байт..((
Ты пару байт сжатия то покажи.
Цитата:Но вот почему 4 байта?? Дык ты на флаговый байт то посмотри:
E7 = 11100111
Нули указывают на две пары байт сжатия: E4 63 и 00 05, обе эти пары указывают на нули, первая копирует 6 нулей, вторая - 8 нулей.
Цитата:Дальше 0005 указывает на байт 03 Не на 03, а на 00, это ведь уже другая пара сжатия. |
|
|
TrickZter |
Отправлено: 03 Февраля, 2016 - 06:22:22
|
Покинул форум
Сообщений всего: 560
Дата рег-ции: Июнь 2015
|
TrickZter
Цитата:Но вот мне не понятно почему нельзя было сжать эти нули одной парой байт, почему их две? Потому что более длинной последовательности нулей не нашлось.
Цитата:h6E означает, что нужно скопировать 16 раз бат по смещению h01 от начала блока. Неверно. Это означает скопировать 16 байт начиная с байта по смещению h01 от начала блока. То есть будет 98 и дальше ещё 15 байтов, которые идут после него.
Вообще советую тебе сначала разобраться с назначением всех битов пары сжатия. |
|
|
Ace Lightning |
Отправлено: 03 Февраля, 2016 - 06:24:21
|
VIP
Покинул форум
Сообщений всего: 480
Дата рег-ции: Июнь 2015
|
Ace Lightning
Цитата:Потому что более длинной последовательности нулей не нашлось.
Спасибо, с этим всё понятно.
Цитата:Неверно. Это означает скопировать 16 байт начиная с байта по смещению h01 от начала блока. То есть будет 98 и дальше ещё 15 байтов, которые идут после него.
Т.е. будет 0098DBDBB8B8 и т.д.?
Но получается как-то не так. Должна получиться вот такая последовательность:
Цитата:Вообще советую тебе сначала разобраться с назначением всех битов пары сжатия.
Ну вот мне до сих пор не понятно назначение вот этих байт (выделены жирным):
11011110 01101110
и что они значат я даже представить не могу(( |
|
|
TrickZter |
Отправлено: 03 Февраля, 2016 - 06:27:15
|
Покинул форум
Сообщений всего: 560
Дата рег-ции: Июнь 2015
|
TrickZter
Цитата:Т.е. будет 0098DBDBB8B8 и т.д.?
С чего ты решил? Копирование происходит не из запакованных, а уже из распакованных байтов.
Цитата:Ну вот мне до сих пор не понятно назначение вот этих байт (выделены жирным):
11011110 01101110
и что они значат я даже представить не могу((
Без понимания всех битов ты не сможешь написать распаковщик. Пробуй менять эти биты и смотри, что происходит с картинкой в игре. |
|
|
TrickZter |
Отправлено: 03 Февраля, 2016 - 07:08:15
|
Покинул форум
Сообщений всего: 560
Дата рег-ции: Июнь 2015
|
TrickZter
Ну вот смотри, если ты байт 28C4E изменишь на DE, то копирование будет начинаться с первого байта картинки.
Теперь из пары DE 62 определим номер самого первого байта картинки:
DE 62 = 11011110 01100010
Младшие 5 бит второго байта - это размер копируемого отрезка, первый байт - это младшая часть номера байта, с которого начинается копирование. Если моя догадка верна и 3 старших бита второго байта - есть три старших бита номера байта, то адрес самого первого байта выходит таковым: 011 11011110, то есть 3DE.
Пусть X1 и X2 - это первый и второй байты сжатия, тогда для получения длины отрезка и номера байта нужно делать следующее (записываю как для Delphi):
Dlina:=(X2 and $1F)+3;
Nomer:=X1+((X2 shr 5) shl 8)-$3DE;
3DE мы вычитаем, так как удобнее считать всё-таки с нуля. До этого ты добавлял значение $22, что равносильно вычитанию $DE.
Если моя догадка верна, то эти формулы должны работать для всей пожатой картинки. Надо только проверить.
З.Ы.: Кстати, в виндовом калькуляторе shr, shl и and тоже есть, так что можно считать через него: |
|
|
|
Поиск в теме | Версия для печати |
Страниц (3): « 1 [2] 3 » |
Сейчас эту тему просматривают: 3 (гостей: 3, зарегистрированных: 0) |
« Экстрим хакинг » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
|
|