![]() |
eXeL@B —› Программирование —› косяк при переводе с Java на С++ |
Посл.ответ | Сообщение |
|
Создано: 30 апреля 2013 15:22 · Личное сообщение · #1 доброго времени суток есть игра - Minecraft, написана на Java. музыка в ней хранится в зашифрованном виде, а я пытаюсь расшифровать её. декомпилил код, переписал... и получил облом. после первых 15 байт расшифровка даёт сбой, и дальше идёт мусор. кто-нибудь может подсказать, что я не учёл? в архиве: 1. несколько java файлов, относящихся к выводу звука. сам алго декрипта - в файле MusInputStream.java 2. пример оригинального/зашифрованного файла 3. моя программа. код ужасен, я знаю. ![]() ![]() |
|
Создано: 30 апреля 2013 15:28 · Поправил: ZaZa · Личное сообщение · #2 -=AkaBOSS=- Посмотрел бегло: Code:
Переполнения не будет? В-общем, мне кажется проблема с типами и их границами... -=AkaBOSS=- пишет: массив, в котором держатся обрабатываеммые данные, я объявил как unsigned char, и это было БОЛЬШОЙ ошибкой. Ха... я так и написал )) ![]() ----- One death is a tragedy, one million is a statistic. ![]() |
|
Создано: 30 апреля 2013 15:38 · Личное сообщение · #3 |
![]() Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 30 апреля 2013 16:17 · Личное сообщение · #4 В джавах не силен, но по моему тут присутствует рекурсия: Code:
![]() |
|
Создано: 30 апреля 2013 16:57 · Личное сообщение · #5 ELF_7719116 пишет: тут присутствует рекурсия Code:
не похоже что-то она бы так из этой рекурсии и не вылезла. Code:
ZaZa нельзя забывать, что хэш инициализируется на основе имени входного файла. поэтому, к моменту начала расшифровки потока там уже есть какое-то значение. после первой же итерации наступает переполнение (результат не умещается в регистр). но, при этом, в джаве хэш тоже объявлен как int, и никаких проблем не возникает (джава установлена х32) я эту задачу уже с пару недель долблю, так и не понял, где нестыковка. ![]() |
|
Создано: 30 апреля 2013 17:04 · Поправил: ZaZa · Личное сообщение · #6 -=AkaBOSS=- В Java int = -2,147,483,648 to 2,147,483,647 C++ unsigned int = 0 to 4,294,967,295 C++ int = –2,147,483,648 to 2,147,483,647 Может попробовать использовать INT вместо UNSIGNED INT -=AkaBOSS=- пишет: нельзя забывать, что хэш инициализируется на основе имени входного файла.поэтому, к моменту начала расшифровки потока там уже есть какое-то значение. Не доглядел... но я ведь предупреждал, что смотрел бегло ![]() ----- One death is a tragedy, one million is a statistic. ![]() |
|
Создано: 30 апреля 2013 17:19 · Личное сообщение · #7 Открыть два отладчика и по шагам сравнивать результат. ----- http://ntinfo.biz ![]() |
|
Создано: 30 апреля 2013 17:33 · Личное сообщение · #8 ZaZa пишет: Может попробовать использовать INT вместо UNSIGNED INT пробовал раньше, попробовал еще раз. разницы никакой. я уже чего только не перепробовал. даже проверял порядок присвоения здесь: Code:
ничего не помогает ![]() hors пишет: Открыть два отладчика и по шагам сравнивать результат. стратегия хорошая, но рабочий код на джаве, и даже в условиях JIT компиляции его там фиг найдёшь ![]() |
|
Создано: 30 апреля 2013 17:38 · Личное сообщение · #9 |
![]() Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 30 апреля 2013 17:48 · Личное сообщение · #10 -=AkaBOSS=- пишет: она бы так из этой рекурсии и не вылезла. Эт понятно. Очевидно, строка - аналог fread. Тогда обращаю внимание на расстановку инкремента В ОРИГИНАЛЕ Code:
ВАШ ЦПП ВАРИАНТ Code:
![]() |
|
Создано: 30 апреля 2013 18:09 · Поправил: -=AkaBOSS=- · Личное сообщение · #11 разобрался таки. спасибо hors за совет про отладчик. запустил игру, приаттачился олькой, нашел по константам нужный код, и понял, почему я дурак ![]() массив, в котором держатся обрабатываеммые данные, я объявил как unsigned char, и это было БОЛЬШОЙ ошибкой. переделал в char, и всё заработало. проблема решена, тему закрываю ![]() |
![]() |
eXeL@B —› Программирование —› косяк при переводе с Java на С++ |
Эта тема закрыта. Ответы больше не принимаются. |