Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.14.142.189] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте я новичок в C++ , появилась необходимость дописать код который находится в string который в в шестнадцатеричной системе счисления.
Т.е. есть файл exe если его открыть hex редактором то мы увидим "49 6E 73 74 61 6C 6C 40" и у меня в коде есть string который содержит данные в 16-й системе, мне нужно их считать из string и записать в конец файла. Спасибо(извините если не достаточно ясно объясняю). |
Сообщ.
#2
,
|
|
|
Например, эта статья поможет понять как работать с файлами.
|
Сообщ.
#3
,
|
|
|
Цитата JoeUser @ как считать файл, и записать в него инфу я знаю и все такие мелкие основы. Но вот как по допустим после адреса 0x00000001 вписать свой hex code я незнаю, в нэте гуглил, там только работа с char где уже прописаны строки, а мне нужно что бы он брал данные из моего string. |
Сообщ.
#4
,
|
|
|
Цитата Jeremy @ нужно что бы он брал данные из моего string Ну вот навскидку функция, которая из строки, заданной шестнадцатеричными кодами формирует "сырую" строку: bool HexToRaw(std::string In, std::string &Out) { size_t Len = In.length(); if (Len % 2 != 0) return false; if (In.find_first_not_of("0123456789abcdefABCDEF") != std::string::npos) return false; std::string Res; for(size_t i=0; i<Len; i+=2) Res += (char)strtol(In.substr(i,2).c_str(), nullptr, 16); Out = Res; return true; } Тут пример онлайн Как дописать строку в файл в двоичном режиме сам найдешь? |
Сообщ.
#5
,
|
|
|
Цитата JoeUser @ дык в этом то и трабл, что как преобразовать в hex это я могу, и назад тоже, а вот как эти данные из стринга записать в код в 16-й системе файла хз. Ответьте ЛС.Пожалуйста |
Сообщ.
#6
,
|
|
|
Цитата Jeremy @ в код в 16-й системе файла хз Не такого понятия "16-чная система файла". Файл - это просто набор байтов. А вот как ты его смотришь (в текстовом редакторе, в hex-редакторе), такое отображение ты и получишь. В твоем случае нужно открыть файл в бинарном режиме и дописать "сырую" строку (полученную HexToRaw, как пример) в конец файла. Примерно так, код не проверял. Если будет ошибка - читай документацию по операциям ввода/вывода. #include <fstream> int main () { std::string Raw; // тут получение сырых данных и помещение их в Raw std::ofstream ofs; ofs.exceptions ( ifstream::failbit | ifstream::badbit ); try { ofs.open("test.exe", std::ofstream::out|std::ofstream::binary|std::ofstream::app); ofs << Raw; ofs.close(); } catch (...) { std::cout << "Что-то пошло не так!"; } return 0; } |
Сообщ.
#7
,
|
|
|
std::ofstream out("4.exe", std::ios::binary | std::ios::app); std::string ffa = "0x14 0x55 0x66"; char sym = 0x33 ; /когда ставлю инфу в char без ковычек то всё норм записывает в файл. а мне нужно считать из стринг, и записать так же как в char std::cout << sym << std::endl; out.seekp(0, std::ios::beg); out.write(&sym, sizeof sym); out.close(); |
Сообщ.
#8
,
Сообщение отклонено: JoeUser -
|
Сообщ.
#9
,
Сообщение отклонено: JoeUser -
|
Сообщ.
#10
,
|
|
|
Jeremy, в первом примере я тебе показал как из 16-ричного представления получить "сырое" содержимое в std::string. Во втором примере - показал как эту строку, содержащую "сырое" содержимое дописать в конец файла. Что еще не понятно?
|
Сообщ.
#11
,
|
|
|
Цитата JoeUser @ Jeremy, в первом примере я тебе показал как из 16-ричного представления получить "сырое" содержимое в std::string. Во втором примере - показал как эту строку, содержащую "сырое" содержимое дописать в конец файла. Что еще не понятно? О_о и в каком месте это то что мне нужно? запустил этот код, после открытия hex редактором внутри оказалось HEX 3078333330 text 0x330 а должно быть HEX 33 text 3 std::string Raw = "0x33"; std::ofstream ofs; ofs.exceptions(std::ifstream::failbit | std::ifstream::badbit); try { ofs.open("4.exe", std::ofstream::out | std::ofstream::binary | std::ofstream::app); ofs << Raw; ofs.close(); } catch (...) { std::cout << "Что-то пошло не так!"; } |
Сообщ.
#12
,
|
|
|
#include <iostream> bool HexToRaw(std::string In, std::string &Out) { size_t Len = In.length(); if (Len % 2 != 0) return false; if (In.find_first_not_of("0123456789abcdefABCDEF") != std::string::npos) return false; std::string Res; for(size_t i=0; i<Len; i+=2) Res += (char)strtol(In.substr(i,2).c_str(), nullptr, 16); Out = Res; return true; } int main() { std::string InString = "33"; // 16-чный код, без 0x std::string Raw; HexToRaw(InString,Raw); std::ofstream ofs; ofs.exceptions(std::ifstream::failbit | std::ifstream::badbit); try { ofs.open("4.exe", std::ofstream::out | std::ofstream::binary | std::ofstream::app); ofs << Raw; ofs.close(); } catch (...) { std::cout << "Что-то пошло не так!"; } return 0; } |
Сообщ.
#13
,
|
|
|
СПАСИБО ОГРОМНОЕ!!!
Если разрешите, то можно вас отблагодарить мороженкой?(в лс кошель) |
Сообщ.
#14
,
|
|
|
спасибо достаточно
Добавлено Чтобы расставить точки над "i" - скину пример, компилируемый без ошибок. После компиляции и линковки полученная прога будет создавать рядом с собой HelloWorld.exe для win32, как видно из кода - создание будет производиться из строки, представленной 16-ричными кодами: #include <iostream> #include <fstream> bool HexToRaw(std::string In, std::string &Out) { size_t Len = In.length(); if (Len % 2 != 0) return false; if (In.find_first_not_of("0123456789abcdefABCDEF") != std::string::npos) return false; std::string Res; for(size_t i=0; i<Len; i+=2) Res += (char)strtol(In.substr(i,2).c_str(), nullptr, 16); Out = Res; return true; } int main() { std::string InString = "4D5A90000300000004000000FFFF0000B80000000000000040000000000000000000000000" "0000000000000000000000000000000000000000000000C00000000E1FBA0E00B409CD21B8" "014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53" "206D6F64652E0D0D0A240000000000000079FC80CB3D9DEE983D9DEE983D9DEE981A5B9598" "389DEE983D9DEF983F9DEE983D9DEE983C9DEE9823CF7F983C9DEE98526963683D9DEE9800" "00000000000000504500004C010100B24CDB4F0000000000000000E00003010B0109000002" "00000000000000000000301000000010000000200000000040000010000000020000050000" "00000000000500000000000000002000000002000000000000020000840000100000100000" "0000100000100000000000001000000000000000000000004C1000003C0000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000000000000000000000" "0000100000100000000000000000000000000000000000000000000000000000002E636F64" "65000000CE0000000010000000010000000200000000000000000000000000002000006000" "00000000000000000000000000000000000000000000000000000000000000981000000000" "0000B410000000000000D1EEEEE1F9E5EDE8E520000000000000CFF0E8E2E5F2F1F2E2F3FE" "21000000006A00681010400068201040006A00FF15081040006A00FF150010400088100000" "0000000000000000A610000000100000901000000000000000000000C21000000810000000" "000000000000000000000000000000000000009810000000000000B4100000000000000401" "4578697450726F63657373004B45524E454C33322E646C6C0000F8014D657373616765426F" "7841005553455233322E646C6C000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000000000000000000000"; std::string RawString; HexToRaw(InString,RawString); std::ofstream ofs; ofs.exceptions(std::ofstream::failbit | std::ofstream::badbit); try { ofs.open("HelloWorld.exe", std::ofstream::out | std::ofstream::binary | std::ofstream::trunc); ofs << RawString; ofs.close(); } catch (...) { std::cout << "Что-то пошло не так!"; } return 0; } |
Сообщ.
#15
,
|
|
|
запустил ваш код, у меня почему то, очень много раз выходит "Что-то пошло не так!"
|
Сообщ.
#16
,
|
|
|
Если строки статичные то почему сразу не писать:
std::string InString = "\x33"; без всех этих велосипедов? |
Сообщ.
#17
,
|
|
|
Add: Антивирусы могут ругаться на создаваемый "HelloWorld.exe", типа троян (Авира ругнулась TR/Crypt.XPACK.Gen3). Уверяю что там все чисто, просто создаваемый экзешних урезан до безобразия. Антивирусы такого не прощают
|
Сообщ.
#18
,
|
|
|
Антивирусы вообще нервно будут относиться к записи в исполняемый файл, содержимое не важно.
|
Сообщ.
#19
,
|
|
|
у меня нет антивируса, ваш exe вродь создался(хоть и выдал кучу раз что что то пошло не так, я попробовал вытащить hex редактором hex значения из видео 40 кб, и записал их в тхт, считал его в стринг и скормил, 50% веса было утеряно)
|
Сообщ.
#20
,
|
|
|
Цитата cppasm @ Если строки статичные Это конечно, т.к. создается сразу нужное. Цитата Jeremy @ запустил ваш код, у меня почему то, очень много раз выходит "Что-то пошло не так!" Прикреплённый файлCreateExe.7z (231,14 Кбайт, скачиваний: 102) |
Сообщ.
#21
,
|
|
|
Код в студию.
Плюс что на входе и что на выходе. Только не 40Кб, а байт 512 для начала. |
Сообщ.
#22
,
|
|
|
чо это? я запустил, ничего не произошло...
|
Сообщ.
#23
,
|
|
|
Цитата Jeremy @ чо это? я запустил, ничего не произошло... Значит что-то не так Все, убегаю по делам. |
Сообщ.
#24
,
|
|
|
вот, пожалуйста заставьте его работать =((((
там есть ошибки =_= и костыли... Прикреплённый файлcode.zip (52,36 Кбайт, скачиваний: 93) |
Сообщ.
#25
,
|
|
|
с getline() тут явно ты что-то не то понаписал...
Добавлено Код вообще жесть какой кривой. Считал ты из файла строку. Что ты с ней потом в цикле делаешь и главное зачем? Добавлено Тебе надо считать строку, HexToRaw, записать строку. Всё. |
Сообщ.
#26
,
|
|
|
разобрался вродь чо да как.
последний вопрос,(Извините что докучаю) как извлечь hex из файла с помощью c++ ( что бы потом с помощью этого кода вставить в другой файл) так как оказалось я не правильно как то скопировал код hex из видео. |
Сообщ.
#27
,
|
|
|
Цитата Jeremy @ там есть ошибки =_= и костыли... #include <iostream> #include <fstream> bool HexToRaw(std::string In, std::string &Out) { size_t Len = In.length(); if (Len % 2 != 0) return false; if (In.find_first_not_of("0123456789abcdefABCDEF") != std::string::npos) return false; std::string Res; for (size_t i = 0; i<Len; i += 2) Res += (char)strtol(In.substr(i, 2).c_str(), nullptr, 16); Out = Res; return true; } int main() { std::ifstream ifs("cz.txt"); std::string InString((std::istreambuf_iterator<char>(ifs)),(std::istreambuf_iterator<char>())); std::string RawString; if (!HexToRaw(InString, RawString)) return -1; std::ofstream ofs; ofs.exceptions(std::ofstream::failbit | std::ofstream::badbit); try { ofs.open("4.mp4", std::ofstream::out | std::ofstream::binary | std::ofstream::trunc); ofs << RawString; ofs.close(); } catch (...) { std::cout << "Что-то пошло не так!"; } return 0; } |
Сообщ.
#28
,
|
|
|
Jeremy, что ты делаешь и зачем ты можешь объяснить?
Надо из одного файла в другой данные перекинуть? Так считай их в бинарнов режиме в буфер и запиши в другой файл. Зачем их в текст конвертировать чтобы потом конвертировать обратно? |
Сообщ.
#29
,
|
|
|
опана заработало О_О
знач всё же правильно вытащил HEX СПАСИБООООО!!!! |