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


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0391 ]   [ 16 queries used ]   [ Generated: 2.05.24, 08:08 GMT ]