-
Постов
2 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные ComCrow
-
-
Доброго времени суток, предполагаю, что изобретаю велосипед, поэтому решил спросить у знатоков.
Из интереса расковыриваю файлы ресурсов игр. Самым простым оказалось извлекать картинки из файлов с расширением rpa. Видимо там нет шифрования.
Объясню как именно это делаю.
Объявил класс Token c полями char note и int reading.
ifstream читает файл и заполняет в vector<Token>. В char идёт исходное значение, в int значение, которое удобно читать.
Когда я до этого пытался написать свой hex-редактор, стоткнулся с тем, что если при преобразовании char в int получается отрицательное число, то в шестнацатеричном виде выводиться ffffc3 например. Сравнивая с тем, что выдают уже готовые hex-редакторы обнаружил, что к таким числам прибавляется 256.
Почему так, я так и не понял, но зато мне мой редактор стал выдавать именно, то что надо. Соответственно читая на хабре как устроен PNG, и читая какую нибудь картинку я теперь получаю, то что надо и могу двигаться дальше.
В текущей программе, которая не только читает биты, но и извлекает, по этой причине я и объявил Token, где одно поле для записи и чтения файла, а другое для анализа.
После того, как файл прочитан, прогоняю через цикл vector, и в других методах сравниваю, каждый элемент:
Спойлерif (tok[t].reading == 0x89) { t = ++t; if (tok[t].reading == 0x50) { t = ++t; if (tok[t].reading == 0x4E) { t = ++t; if (tok[t].reading == 0x47) { return true;
Привёл только один метод, но по факту получаю 2 вектора с сигнтурой начала и конца файла PNG. В будущем планирую и другие форматы добавить, но пока итак проблем хватает.
После чего проверяю, что оба вектора равной длины, беру номера пар элементов, и записываю в каждый раз новый ofstream от сих до сих.
И на небольших файлах всё работает замечательно. Я брал файл 35 Мб, и извлёк из него 80 картинок, но когда попробовал с файлом 153 Мб, получаю bad_alloc, даже если оперативной памяти хватает.
Подозреваю, что другие люди с прямыми руками уже делали что либо подобное, но в гугле не смог ничего найти.
Пока не хватает фантазии придумать что-то адекватное, только если объявить vector<vector<Token>>, но как-то даже для меня слишком костыльно.
Был бы признателен, если наставите на путь истинный.
[bad_alloc] переполнение памяти C++
in Низкоуровневое программирование
Опубликовано · Изменено пользователем ComCrow
пробел не красиво стоял
Сразу столько интересного. Обязательно ознакомлюсь, спасибо.
Т.е есть вектор в котором всё хранится, если максимально просто vector<char> trash размером 100. Мы знаем, что картинка начинается обязательно с 0x89, 50, 4E, 47, и обязательно заканчивается на 42, 60, 82. И нам нужно найти номера элементов, которые равны 89 и 82, и чтобы обязательно сбоку были 50 и 60. Допустим такие расположены в ячейках 20, 40, 60, 80. Заносим эти номера в vector<int> start_point и vector<int> end_point.
Далее прогоняем по циклу. Все char с 20 по 40 записать в файл 1.png, все char с 60 по 80 в файл 2.png
А так, к созданию представления я бы своим умом бы долго приходил)