Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
xman911
0 / 0 / 0
Регистрация: 22.12.2012
Сообщений: 68
#1

Открыть бинарный файл(.ехе) и сохранить часть байтов в текст - C++

14.12.2013, 02:07. Просмотров 1203. Ответов 9
Метки нет (Все метки)

Всем привет. Задача такая: нужно прочитать .exe. в конце его есть некие спецсимволы, которые мне нужно прочитать.

Например они начинаются с "{${" и заканчиваются символами "}$}"

например:

...blablabla...dfsdf8493uijf098jlsdvk....
...blablalbla...

{${SomeMessageForME}$}
...sdkfsoijs...\...\
...
...


вот нужно все вычитать, и сохранить например в std::string.

пока у меня траблы с этим. файл читаю... байты вроде как вижу... но в стрингу передать нормально не могу.

Суть в том что потом мне нужно распарсить тот кусок текста... т.е. работать со стрингом очень удобно.

Но пока не получается. все что копируется в стринг - это массивом, а мне нужно строкой. чтобы потом можно было выполнять .find() .substr() и прочие методы.


Заранее благодарен.

вот код как я пробую читать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#define FILE_PATH "C:\\noam.exe.exe"
 
 
#include <string>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <sstream>
 
 
std::string ReadFile()
{
    //////////////////////////////////////////////////////////////////////////
    std::ifstream fs;
    fs.open (FILE_PATH);
    if (fs.fail()) {
        //std::cerr << "Failed to open file!\n";
        //return 1;
    }
    fs.seekg(0, std::ios::end);
    size_t i = fs.tellg();
    char* buf = new char[i];
    fs.seekg(0, std::ios::beg);
    fs.read (buf, i);
    fs.close();
    std::string s;
    s.assign (buf, i);
    //////////////////////////////////////////////////////////////////////////
    std::stringstream scmp;
    for (int nLbuf=0; nLbuf< i; nLbuf++)
    {
        //std::cout << buf[nLbuf];
        scmp << buf[nLbuf];
        
    }
 
 
    //////////////////////////////////////////////////////////////////////////
 
 
    delete [] buf;
    std::string sss="";
    sss=scmp.str();
 
    int nnn = sss.find("{${"); return -1 :(
    //////////////////////////////////////////////////////////////////////////
    
    for (std::string::const_iterator it = s.begin(); it != s.end()-1; it++)
    {
        //std::cout << (*it);
 
        sss.append(&*it);
        if (sss.find("<$") != -1)
        {
            break; //этот какакод ваще не пашет - копируется очень много всякой ерунды в sss
        }
        
    }
    nnn = sss.find("<$"); /// -1
    //////////////////////////////////////////////////////////////////////////
 
    
    //////////////////////////////////////////////////////////////////////////
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2013, 02:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Открыть бинарный файл(.ехе) и сохранить часть байтов в текст (C++):

Не получается открыть бинарный файл - C++
Всем привет! Есть класс Garage! у него приватное поле string name и поле fstream inv; Есть метод для записи имени в файл: void...

Как сохранить\прочитать контейнер в бинарный файл - C++
ostream_iterator&lt;string, char&gt; out(cout, &quot;\n&quot;); set&lt;string&gt; mat; set&lt;string&gt; pat; string temp; cout &lt;&lt; &quot;Input Mat's...

Записать информационную часть списка в бинарный файл, и прочитать его - C++
Подскажите, как записать информационную часть измененного списка в бинарный файл и прочитать его? #include &quot;stdafx.h&quot; #include...

Как правильно сохранить и потом считать структуру в бинарный файл - C++
Есть структура struct card { int size; char *lear; int *name; }; Эта структура это карты игрока. Заполняем ее данными, у...

Как открыть бинарный файл, не зная его структуру? - C++
Можно ли как-нибудь открыть бинарный файл, не зная его структуру?

Как сохранить в бинарный файл ресурсы, указатели на которые лежат в векторе? - C++
Здравствуйте! Вот есть такая програмка: #include &lt;iostream&gt; #include &lt;vector&gt; #define FIELD_LENGHT 20 using namespace std; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.12.2013, 02:18 #2
Не понял, что нужно в string поместить: весь файл или только нужный участок?
Цитата Сообщение от xman911 Посмотреть сообщение
{${SomeMessageForME}$}
Добавлено через 2 минуты
Цитата Сообщение от xman911 Посмотреть сообщение
все что копируется в стринг - это массивом
Как понять: массивом? Если что-то находится в string, то это всегда string.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
14.12.2013, 02:26 #3
для начала ты считываешь весь файл
Цитата Сообщение от xman911 Посмотреть сообщение
fs.read (buf, i);
а потом пытаешься запихать сей буфер в строку
Цитата Сообщение от xman911 Посмотреть сообщение
s.assign (buf, i);
не получится
в .exe. куча мест где байты равны 0, а это означает конец строки
ищи свое {${
побайтово считывая а только потом считывай в строку
xman911
0 / 0 / 0
Регистрация: 22.12.2012
Сообщений: 68
14.12.2013, 16:50  [ТС] #4
так как у меня искомое всегда в конце файла - нужно читать с конца.
только вот никак не получается читать побайтово с конца... не могу понять как правильно((

Добавлено через 18 минут
сейчас читаю вот так...
только как-то оно не правильно читает, повторяется постоянно...
в s добавляется например по итерациям:
1) а
2) аб
3) абс
4) абсд
....

результат: аабабсабсд, а должно быть : абсд
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
std::ifstream fs;
    fs.open (FILE_PATH,std::ios::in|std::ios::binary);
    if (fs.fail()) {
        //std::cerr << "Failed to open file!\n";
        //return 1;
    }
    
    fs.seekg(0, std::ios::end);
    size_t i = fs.tellg();
    char* buf = new char[i];
    fs.seekg(0, std::ios::beg);
    fs.read (buf, i);
    fs.close();
    std::string s;
    s.assign (buf, i);
    //////////////////////////////////////////////////////////////////////////
    std::stringstream scmp;
    //std::string sss="";
    s.clear();
    for (unsigned int nLbuf=i; nLbuf>=1; nLbuf--)
    {
        //std::cout << buf[nLbuf];
        //scmp << &buf[nLbuf];
        
        s.append((char*)&buf[nLbuf]);
    }
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.12.2013, 17:11 #5
Цитата Сообщение от xman911 Посмотреть сообщение
так как у меня искомое всегда в конце файла - нужно читать с конца.
Такой файл большой, что с начала никак?
Цитата Сообщение от ValeryS Посмотреть сообщение
для начала ты считываешь весь файл
Сообщение от xman911 fs.read (buf, i); а потом пытаешься запихать сей буфер в строку
Сообщение от xman911 s.assign (buf, i); не получится
в .exe. куча мест где байты равны 0, а это означает конец строки
Поняли о чём пишут?
xman911
0 / 0 / 0
Регистрация: 22.12.2012
Сообщений: 68
14.12.2013, 17:20  [ТС] #6
Цитата Сообщение от alsav22 Посмотреть сообщение
Такой файл большой, что с начала никак?

Поняли о чём пишут?
ла, я то понимаю.... у меня мое искомое, что точно текст, всегда в конце.
мне нужно прочитать файл посимвольно/побайтово с конца, а не с начала. как только получу полное искомое, например "{${mYcOOLMessage}$}" - записать в стринг как текст. вот собственно и все что требуется....

пока никак с конца не могу нормально прочитать.

Добавлено через 1 минуту
[QUOTE=alsav22;5492849]Такой файл большой, что с начала никак?

да... но проблема больше в том, что как раз потом идет много не ASCII символов (выходящим за его пределы) и чтение бьется. В конце всегда зашит искомый текст...
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.12.2013, 17:32 #7
Цитата Сообщение от xman911 Посмотреть сообщение
ла, я то понимаю....
Если понимаете, то зачем опять (код в 4 посте)?:
C++
1
2
3
4
fs.read (buf, i);
fs.close();
std::string s;
s.assign (buf, i);
Цитата Сообщение от xman911 Посмотреть сообщение
пока никак с конца не могу нормально прочитать.
Ищите, с конца файла, начало нужных данных ({${ или как оно там начинается), потом только читайте в строку.
xman911
0 / 0 / 0
Регистрация: 22.12.2012
Сообщений: 68
14.12.2013, 18:09  [ТС] #8
Ну вот как-то так получилось:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
std::ifstream ifs (FILE_PATH,std::ifstream::in | std::ifstream::binary);
 
    if (ifs.good())
    {
 
        ifs.seekg(0,std::ifstream::end);
        int sizeBuff;
        std::string content;
        sizeBuff=1;
        while (content.find("{${")==-1)
        {
            content.clear();
            ifs.seekg(-sizeBuff,std::ifstream::end);
            content.assign((std::istreambuf_iterator<char>(ifs)),
                std::istreambuf_iterator<char>());
 
            sizeBuff++;
        }
        
 
        std::cout << content << std::endl;
    }
    //////////////////////////////////////////////////////////////////////////
если кто предложит как не использовать .assign - то хотелось бы узнать... а то мне не оч нравится как вышло(
gazlan
3131 / 1906 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
14.12.2013, 19:09 #9
Цитата Сообщение от xman911 Посмотреть сообщение
Например они начинаются с "{${" и заканчиваются символами "}$}"
1. Отображаем файл в память
2. Ищем (быстрым поиском, BM, например), первое вхождение подстроки "{${"
3. Аналогично, отыскиваем следующее за ней вхождение подстроки "}$}"
4. Копируем в выходной файл все, что между ними

То, что файл бинарный, вообще не имеет никакого значения.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
14.12.2013, 19:11 #10
Цитата Сообщение от gazlan Посмотреть сообщение
1. Отображаем файл в память
так он уже скопировал файл в буфер
Цитата Сообщение от xman911 Посмотреть сообщение
fs.read (buf, i);
пускай в этом буфере и ищет
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2013, 19:11
Привет! Вот еще темы с ответами:

Открыть, сохранить, закрыть файл - C++
программа осуществляет обработку данных из файла.Главное меню имеет вид: 1)файл 2)редактировать документ 3)... Вид меню &quot;Файл&quot;: ...

Как открыть файл xlsx и сохранить в txt? - C++
Написать консольное windows приложение на Visual C++ со следующим функционалом: - на вход программы (в виде параметров командной строки)...

Открыть файл и сохранить туда любую информацию - C++
У меня небольшой вопрос. Как с помощью сишных функций работы с файлами, организовать открытие файла и сохранение туда любой информации?? ...

Сохранить текст Кириллицы в файл - C++
Нужно чтобы при сохранении строки в файл она сохранялась.. нормально :) не знаю как правильно сказать: сохранялась в нормальной кодировке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.12.2013, 19:11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru