Chief-NET

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Chief-NET » Базовый хакинг » Помогите новичку с переводом


Помогите новичку с переводом

Сообщений 121 страница 140 из 152

121

Как идут дела с переводом?

122

Потихоньку вставляю переведённый текст. Так же пытаюсь написать распаковщик графики. Вот сессия закончится и вплотную займусь переводом :)

123

У меня снова проблемы с алгоритмом сжатия...
Хотелось бы вернуться на несколько страниц назад в теме..

Код:
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 байта. Так вот он мне распакует данные вот так:

Код:
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

А для того, чтобы была последовательность вида:

Код:
AA 55 55 AA AA 55 55 AA AA 55 55 AA AA 55 55 AA

Мне нужно скопировать не 33 байта, а 12 байт..((

Так же у меня есть последовательность:

Код:
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 раз. Не могу понять почему так... (((

заранее прошу прощения, что я такой непонятливый...

124

Мне нужно скопировать не 33 байта, а 12 байт..((

Ты пару байт сжатия то покажи.

Но вот почему 4 байта??

Дык ты на флаговый байт то посмотри:
E7 = 11100111
Нули указывают на две пары байт сжатия: E4 63 и 00 05, обе эти пары указывают на нули, первая копирует 6 нулей, вторая - 8 нулей.

Дальше 0005 указывает на байт 03

Не на 03, а на 00, это ведь уже другая пара сжатия.

125

Ты пару байт сжатия то покажи.


Последовательность в роме:
AA 55 55 AA 94 7E

Незапакованная последовательность:
AA 55 55 AA AA 55 55 AA AA 55 55 AA AA 55 55 AA

Не на 03, а на 00, это ведь уже другая пара сжатия.


ой, да. Тут моя ошибка. Но вот мне не понятно почему нельзя было сжать эти нули одной парой байт, почему их две?

Давайте я напишу как я понимаю принцип распаковки, а Вы если что поправите меня. Например:
F5 00 DE 6E 98 F0 60 D8 D8 B8 B8 FE F0 61 98 98 00 00 7D 7D 61

1.0)F5 - флаговый байт. (11110101)
1.1)Первый байт копируем без изменений.
00
1.2)Следующие два байта для распаковки.
hDE -> h01
h6E означает, что нужно скопировать 16 раз бат по смещению h01 от начала блока.
(подчёркнутый - что копируем, жирный - куда копируем)
01. 0000
02. 000000
03. 00000000
04. 0000000000
05. 000000000000
06. 00000000000000
07. 0000000000000000
08. 000000000000000000
09. 00000000000000000000
10. 0000000000000000000000
11. 000000000000000000000000
12. 00000000000000000000000000
13. 0000000000000000000000000000
14. 000000000000000000000000000000
16. 00000000000000000000000000000000
1.3)Копируем байт без изменений.
000000000000000000000000000000000098
1.4)Следующие два байта для распаковки.
hF0 -> h12 -> 17
Копируем 3 раза байт по смещению h12 от начала.
1. 00000000000000000000000000000000009898
2. 0000000000000000000000000000000000989898
3. 000000000000000000000000000000000098989898
1.5)Копируем байт без изменений.
000000000000000000000000000000000098989898D8
1.6)Копируем байт без изменений.
000000000000000000000000000000000098989898D8D8
1.7)Копируем байт без изменений.
000000000000000000000000000000000098989898D8D8B8
1.8)Копируем байт без изменений.
000000000000000000000000000000000098989898D8D8B8B8

2.0)FE - флаговый байт. (11111110)
2.1)Следующие два байта для распаковки.
hF0(уже было) -> h12 -> 17
Копируем 4 раза байт по смещению h12 от начала.
1. 000000000000000000000000000000000098989898D8D8B8B898
2. 000000000000000000000000000000000098989898D8D8B8B89898
3. 000000000000000000000000000000000098989898D8D8B8B8989898
4. 000000000000000000000000000000000098989898D8D8B8B898989898
2.2)Копируем байт без изменений.
000000000000000000000000000000000098989898D8D8B8B89898989898
2.3)Копируем байт без изменений.
000000000000000000000000000000000098989898D8D8B8B8989898989898
2.4)Копируем байт без изменений.
000000000000000000000000000000000098989898D8D8B8B898989898989800
2.5)Копируем байт без изменений.
000000000000000000000000000000000098989898D8D8B8B89898989898980000
2.6)Копируем байт без изменений.
000000000000000000000000000000000098989898D8D8B8B898989898989800007D
2.7)Копируем байт без изменений.
000000000000000000000000000000000098989898D8D8B8B898989898989800007D7D
2.8)Копируем байт без изменений.
000000000000000000000000000000000098989898D8D8B8B898989898989800007D7D61

126

Но вот мне не понятно почему нельзя было сжать эти нули одной парой байт, почему их две?

Потому что более длинной последовательности нулей не нашлось.

h6E означает, что нужно скопировать 16 раз бат по смещению h01 от начала блока.

Неверно. Это означает скопировать 16 байт начиная с байта по смещению h01 от начала блока. То есть будет 98 и дальше ещё 15 байтов, которые идут после него.

Вообще советую тебе сначала разобраться с назначением всех битов пары сжатия.

Отредактировано TrickZter (2011-06-15 15:49:39)

127

Потому что более длинной последовательности нулей не нашлось.

Спасибо, с этим всё понятно.

Неверно. Это означает скопировать 16 байт начиная с байта по смещению h01 от начала блока. То есть будет 98 и дальше ещё 15 байтов, которые идут после него.

Т.е. будет 0098DBDBB8B8 и т.д.?
Но получается как-то не так. Должна получиться вот такая последовательность:
http://i23.fastpic.ru/big/2011/0615/93/7955d07b042515b871f076c7ac119c93.jpg

Вообще советую тебе сначала разобраться с назначением всех битов пары сжатия.

Ну вот мне до сих пор не понятно назначение вот этих байт (выделены жирным):
11011110 01101110
и что они значат я даже представить не могу((

128

Т.е. будет 0098DBDBB8B8 и т.д.?

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

Ну вот мне до сих пор не понятно назначение вот этих байт (выделены жирным):
11011110 01101110
и что они значат я даже представить не могу((

Без понимания всех битов ты не сможешь написать распаковщик. Пробуй менять эти биты и смотри, что происходит с картинкой в игре.

Отредактировано TrickZter (2011-06-15 16:32:34)

129

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

Я это понимаю. На первом шаге у меня копируется без изменения 00. И больше пока у меня нету распакованных данных.

Без понимания всех битов ты не сможешь написать распаковщик. Пробуй менять эти биты и смотри, что происходит с картинкой в игре.

Хорошо, попробую..

Отредактировано Ace Lightning (2011-06-15 16:50:30)

130

Ща гляну - посмотрю чё эти биты делают.

Отредактировано TrickZter (2011-06-15 16:50:45)

131

TrickZter
Ну как?

132

Судя по всему это старшие биты адреса байта, но нужно проверять.

133

Хмм... чтож, буду разбираться.. хотя это сложновато)

134

Ну вот смотри, если ты байт 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 тоже есть, так что можно считать через него:

[реклама вместо картинки]

Отредактировано TrickZter (2011-06-17 14:04:05)

135

TrickZter
Похоже работает! Ту последовательность, которую я приводил в качестве примера несколькими постами выше он распаковал верно:) Спасибо большое!

Завтра начну писать распаковщик :)
-------
Весь текст в игре переведён, осталось разобраться с графикой и протестировать игру :)
Вот парочка спойлеров:
http://i23.fastpic.ru/big/2011/0617/9c/b1936d82740833370004b59e87e4749c.gif

Так же, если шрифт не подходит, то можно вернуться к шрифту, как в оригинале.
http://i23.fastpic.ru/big/2011/0617/22/4d00631ba8fcfcb3f6b2404c4b528422.jpg

Отредактировано Ace Lightning (2011-06-17 21:05:08)

136

первый шрифт оставляй))) красота))

137

первый шрифт оставляй))) красота))

Ок :)

TrickZter
Что-то не работает.. например для пары байт (выделены жирным) вот в этой последовательности:
F5 00 DE 6E 98 F0 60 D8 D8 B8 B8 FE F0 61 98 98 00 00 7D 7D 61 F6 02 00 79 79 02 01 7D 7D 00 00

Там номер получается отрицательным..

Отредактировано Ace Lightning (2011-06-18 22:45:32)

138

Там номер получается отрицательным..

А, надо просто отсеить лишнюю часть, оставив только младшие 11 бит. Тогда формула вычисления номера приобретает следующий вид:

Nomer:=(X1+((X2 shr 5) shl 8)-$3DE) and $7FF;

при паре 02 00 у тебя получится следующее:
(2+0-$3DE) and $7FF
-$3DC and $7FF
Результат: $424 или 1060 (если в десятичном виде).

Отредактировано TrickZter (2011-06-19 07:43:54)

139

Вот мне бы не and $7FF, а and $FF, т.к. мне как раз из $424 нужно именно $24 (или 36 в десятичной), тогда эти два бита распаковываются правильно, но дальше получается каша..

140

Если так, значит старшие 3 бита второго байта работают как-то иначе. Надо проверять как они реально работают :)

Отредактировано TrickZter (2011-06-19 16:34:56)


Вы здесь » Chief-NET » Базовый хакинг » Помогите новичку с переводом