На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Модераторы: Qraizer
  
> дописать код в шестнадцатеричной системе счисления в файл
    Здравствуйте я новичок в C++ , появилась необходимость дописать код который находится в string который в в шестнадцатеричной системе счисления.
    Т.е. есть файл exe если его открыть hex редактором то мы увидим "49 6E 73 74 61 6C 6C 40" и у меня в коде есть string который содержит данные в 16-й системе, мне нужно их считать из string и записать в конец файла.
    Спасибо(извините если не достаточно ясно объясняю).
      Например, эта статья поможет понять как работать с файлами.
        Цитата JoeUser @

        как считать файл, и записать в него инфу я знаю и все такие мелкие основы.
        Но вот как по допустим после адреса 0x00000001 вписать свой hex code я незнаю, в нэте гуглил, там только работа с char где уже прописаны строки, а мне нужно что бы он брал данные из моего string.
          Цитата Jeremy @
          нужно что бы он брал данные из моего string

          Ну вот навскидку функция, которая из строки, заданной шестнадцатеричными кодами формирует "сырую" строку:

          ExpandedWrap disabled
            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;    
            }

          Тут пример онлайн

          Как дописать строку в файл в двоичном режиме сам найдешь?
            Цитата JoeUser @

            дык в этом то и трабл, что как преобразовать в hex это я могу, и назад тоже, а вот как эти данные из стринга записать в код в 16-й системе файла хз.
            Ответьте ЛС.Пожалуйста
              Цитата Jeremy @
              в код в 16-й системе файла хз

              Не такого понятия "16-чная система файла". Файл - это просто набор байтов. А вот как ты его смотришь (в текстовом редакторе, в hex-редакторе), такое отображение ты и получишь.

              В твоем случае нужно открыть файл в бинарном режиме и дописать "сырую" строку (полученную HexToRaw, как пример) в конец файла.

              Примерно так, код не проверял.
              Если будет ошибка - читай документацию по операциям ввода/вывода.

              ExpandedWrap disabled
                #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;
                }
                ExpandedWrap disabled
                  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();
                Сообщение отредактировано: Jeremy -
                      Jeremy, в первом примере я тебе показал как из 16-ричного представления получить "сырое" содержимое в std::string. Во втором примере - показал как эту строку, содержащую "сырое" содержимое дописать в конец файла. Что еще не понятно?
                        Цитата JoeUser @
                        Jeremy, в первом примере я тебе показал как из 16-ричного представления получить "сырое" содержимое в std::string. Во втором примере - показал как эту строку, содержащую "сырое" содержимое дописать в конец файла. Что еще не понятно?

                        О_о и в каком месте это то что мне нужно?
                        запустил этот код, после открытия hex редактором внутри оказалось
                        HEX 3078333330
                        text 0x330
                        а должно быть
                        HEX 33
                        text 3
                        ExpandedWrap disabled
                          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 << "Что-то пошло не так!";
                                      }
                          ExpandedWrap disabled
                            #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;
                            }
                          Сообщение отредактировано: JoeUser -
                            СПАСИБО ОГРОМНОЕ!!!
                            Если разрешите, то можно вас отблагодарить мороженкой?(в лс кошель)
                              :) спасибо достаточно

                              Добавлено
                              Чтобы расставить точки над "i" - скину пример, компилируемый без ошибок.
                              После компиляции и линковки полученная прога будет создавать рядом с собой HelloWorld.exe для win32,
                              как видно из кода - создание будет производиться из строки, представленной 16-ричными кодами:

                              ExpandedWrap disabled
                                #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;
                                }
                                запустил ваш код, у меня почему то, очень много раз выходит "Что-то пошло не так!"
                                  Если строки статичные то почему сразу не писать:
                                  ExpandedWrap disabled
                                    std::string InString = "\x33";

                                  без всех этих велосипедов?
                                    Add: Антивирусы могут ругаться на создаваемый "HelloWorld.exe", типа троян (Авира ругнулась TR/Crypt.XPACK.Gen3). Уверяю что там все чисто, просто создаваемый экзешних урезан до безобразия. Антивирусы такого не прощают :lol:
                                      Антивирусы вообще нервно будут относиться к записи в исполняемый файл, содержимое не важно.
                                        у меня нет антивируса, ваш exe вродь создался(хоть и выдал кучу раз что что то пошло не так, я попробовал вытащить hex редактором hex значения из видео 40 кб, и записал их в тхт, считал его в стринг и скормил, 50% веса было утеряно)
                                          Цитата cppasm @
                                          Если строки статичные

                                          Это конечно, т.к. создается сразу нужное.

                                          Цитата Jeremy @
                                          запустил ваш код, у меня почему то, очень много раз выходит "Что-то пошло не так!"

                                          Прикреплённый файлПрикреплённый файлCreateExe.7z (231,14 Кбайт, скачиваний: 102)
                                            Код в студию.
                                            Плюс что на входе и что на выходе.
                                            Только не 40Кб, а байт 512 для начала.
                                              чо это? я запустил, ничего не произошло...
                                                Цитата Jeremy @
                                                чо это? я запустил, ничего не произошло...

                                                Значит что-то не так :lol: Все, убегаю по делам.
                                                  вот, пожалуйста заставьте его работать =((((
                                                  там есть ошибки =_= и костыли...
                                                  Прикреплённый файлПрикреплённый файлcode.zip (52,36 Кбайт, скачиваний: 93)
                                                  Сообщение отредактировано: Jeremy -
                                                    с getline() тут явно ты что-то не то понаписал...

                                                    Добавлено
                                                    Код вообще жесть какой кривой.
                                                    Считал ты из файла строку.
                                                    Что ты с ней потом в цикле делаешь и главное зачем?

                                                    Добавлено
                                                    Тебе надо считать строку, HexToRaw, записать строку.
                                                    Всё.
                                                    Сообщение отредактировано: cppasm -
                                                      разобрался вродь чо да как.
                                                      последний вопрос,(Извините что докучаю)
                                                      как извлечь hex из файла с помощью c++ ( что бы потом с помощью этого кода вставить в другой файл)
                                                      так как оказалось я не правильно как то скопировал код hex из видео.
                                                        Цитата Jeremy @
                                                        там есть ошибки =_= и костыли...

                                                        ExpandedWrap disabled
                                                          #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;
                                                          }
                                                          Jeremy, что ты делаешь и зачем ты можешь объяснить?
                                                          Надо из одного файла в другой данные перекинуть?
                                                          Так считай их в бинарнов режиме в буфер и запиши в другой файл.
                                                          Зачем их в текст конвертировать чтобы потом конвертировать обратно?
                                                          Сообщение отредактировано: cppasm -
                                                            опана заработало О_О
                                                            знач всё же правильно вытащил HEX
                                                            СПАСИБООООО!!!!
                                                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                            0 пользователей:


                                                            Рейтинг@Mail.ru
                                                            [ Script execution time: 0,0711 ]   [ 21 queries used ]   [ Generated: 19.04.24, 13:55 GMT ]