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

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

Восстановить пароль Регистрация
 
xman911
0 / 0 / 0
Регистрация: 22.12.2012
Сообщений: 68
14.12.2013, 02:07     Открыть бинарный файл(.ехе) и сохранить часть байтов в текст #1
Всем привет. Задача такая: нужно прочитать .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
    //////////////////////////////////////////////////////////////////////////
 
    
    //////////////////////////////////////////////////////////////////////////
 
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.12.2013, 02:18     Открыть бинарный файл(.ехе) и сохранить часть байтов в текст #2
Не понял, что нужно в string поместить: весь файл или только нужный участок?
Цитата Сообщение от xman911 Посмотреть сообщение
{${SomeMessageForME}$}
Добавлено через 2 минуты
Цитата Сообщение от xman911 Посмотреть сообщение
все что копируется в стринг - это массивом
Как понять: массивом? Если что-то находится в string, то это всегда string.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
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
5282 / 4801 / 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
5282 / 4801 / 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
2862 / 1810 / 272
Регистрация: 27.08.2010
Сообщений: 4,904
Записей в блоге: 1
14.12.2013, 19:09     Открыть бинарный файл(.ехе) и сохранить часть байтов в текст #9
Цитата Сообщение от xman911 Посмотреть сообщение
Например они начинаются с "{${" и заканчиваются символами "}$}"
1. Отображаем файл в память
2. Ищем (быстрым поиском, BM, например), первое вхождение подстроки "{${"
3. Аналогично, отыскиваем следующее за ней вхождение подстроки "}$}"
4. Копируем в выходной файл все, что между ними

То, что файл бинарный, вообще не имеет никакого значения.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2013, 19:11     Открыть бинарный файл(.ехе) и сохранить часть байтов в текст
Еще ссылки по теме:

Как сохранить\прочитать контейнер в бинарный файл C++
Не получается открыть бинарный файл C++
C++ Как открыть файл xlsx и сохранить в txt?

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
14.12.2013, 19:11     Открыть бинарный файл(.ехе) и сохранить часть байтов в текст #10
Цитата Сообщение от gazlan Посмотреть сообщение
1. Отображаем файл в память
так он уже скопировал файл в буфер
Цитата Сообщение от xman911 Посмотреть сообщение
fs.read (buf, i);
пускай в этом буфере и ищет
Yandex
Объявления
14.12.2013, 19:11     Открыть бинарный файл(.ехе) и сохранить часть байтов в текст
Ответ Создать тему
Опции темы

Текущее время: 14:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru