Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.216.123.120] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#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
,
|
|
|
запустил ваш код, у меня почему то, очень много раз выходит "Что-то пошло не так!"
|