Перейти к содержанию

ComCrow

Стажёры
  • Постов

    2
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные ComCrow

  1. 31 минуту назад, Xipho сказал:

    Сразу столько интересного. Обязательно ознакомлюсь, спасибо.

    31 минуту назад, Xipho сказал:

    По остальному - я вообще ничего не понял, если честно. Можешь алгоритм текстом расписать?

    Т.е есть вектор в котором всё хранится, если максимально просто 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

    А так, к созданию представления я бы своим умом бы долго приходил)

  2. Доброго времени суток, предполагаю, что изобретаю велосипед, поэтому решил спросить у знатоков.

    Из интереса расковыриваю файлы ресурсов игр. Самым простым оказалось извлекать картинки из файлов с расширением 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>>, но как-то даже для меня слишком костыльно.

    Был бы признателен, если наставите на путь истинный.

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.