Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/32: Рейтинг темы: голосов - 32, средняя оценка - 5.00
11 / 11 / 1
Регистрация: 01.12.2011
Сообщений: 157
Записей в блоге: 2
1

Hex редактирование - замена строк в файле

28.04.2012, 16:27. Показов 6608. Ответов 15
Метки нет (Все метки)

Есть файл (вернее 3d модель) в котором нужно сменить имя текстуры, при помощи Free Hex Editor Neo это можно спокойной делать:

грузите файлы на форум

Hex редактирование - замена строк в файле


 Комментарий модератора 
Для вложений используйте встроенные возможности форума: кнопка Расширенный режим->Управление вложениями внизу окна редактирования сообщения, или в окне редактирования нажмите на скрепку.
Правила
2.11. Картинки загружайте на форум, во избежание их удаления или потери на сторонних ресурсах.
Картинки можно вставлять в любое место поста: для этого нужно в это место установить курсор, нажать на скрепку и выбрать картинку из выпадающего списка.


Но таких файлов очень много. Поэтому вопрос можно ли сделать программу которая автоматизированно сама заменяла нужные строки?
Например все "act_arm_perchatka.models" заменить на "act_arm_perchatk1.models". Заметьте что символ "a" заменился на "1", символ "1" не добавлялся после "a".

Заране спасибо!

З.Ы.:Прикрепил файл на всякий случай, запакован в .rar архив.
0
Вложения
Тип файла: rar wpn_abakan_hud.rar (420.9 Кб, 53 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.04.2012, 16:27
Ответы с готовыми решениями:

Поиск и замена hex значения в dll файле
Как мне найти и заменить несколько hex значений в dll файле?

Редактирование hex значений в файле
Всем привет. Не знаю как сделать то что на 2 скриншотах. На 1 до, на втором - после. В какую...

Поиск и замена hex значения в dll файле
Как мне найти и заменить несколько hex значений в dll файле?

Редактирование строк в txt файле
Здравствуйте. Имеется программа, которая считывает построчно текстовый файл, и заменяет в нём одну...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
15
return (true);
1973 / 1108 / 219
Регистрация: 19.04.2011
Сообщений: 2,345
29.04.2012, 06:21 2
Непонятно, при чем тут Hex-редактирование
1. Открыть файл
2. Найти последовательность байт
3. Заменить нужный
4. Закрыть файл
5. Повторять п.1-4 для всех файлов
1
11 / 11 / 1
Регистрация: 01.12.2011
Сообщений: 157
Записей в блоге: 2
29.04.2012, 07:47  [ТС] 3
mimicria, Просто я подумал раз программа Hex Editor то и редактирование должно быть hex.
А можно поподробней? Хотя бы небольшой пример кода, пожалуйста.
0
LK
Заблокирован
29.04.2012, 14:41 4
Корректно загрузить содержимое файла
1
11 / 11 / 1
Регистрация: 01.12.2011
Сообщений: 157
Записей в блоге: 2
29.04.2012, 21:55  [ТС] 5
mimicria, LK, Всё вроде замечательно спасибо за код, только загружает долго конечно. Но не эта проблема самая важная.
mimicria, после твоего кода вставил вот такие строк, для замены wpn\wpn_vog в Memo1 на wpn\wpn_vo1
C++
1
2
3
4
5
6
7
 AnsiString var="wpn\wpn_vog";
 
 while(int i=Memo1->Text.Pos(var))
   {
     Memo1->Text = Memo1->Text.Delete(i,var.Length());
     Memo1->Text = Memo1->Text.Insert("wpn\wpn_vo1",i);
   }
Но ничего не сработало, ничего не извинилось. Что не так сделал?
0
Практикантроп
4679 / 2599 / 496
Регистрация: 23.09.2011
Сообщений: 5,579
29.04.2012, 22:21 6
Цитата Сообщение от X_Starter_X Посмотреть сообщение
Что не так сделал?
-на бэкслэше сэкономили (два же нужно..)
C++
1
2
3
4
5
6
      AnsiString var="wpn\\wpn_vog";
      while(int i=Memo1->Text.Pos(var))
   {
         Memo1->Text = Memo1->Text.Delete(i,var.Length());
         Memo1->Text = Memo1->Text.Insert("wpn\\wpn_vo1",i);
   }
1
11 / 11 / 1
Регистрация: 01.12.2011
Сообщений: 157
Записей в блоге: 2
29.04.2012, 23:02  [ТС] 7
nick42, Ухты действительно помогло. Я думал два бэкслеша только в пути прописывают.
Теперь глупый вопрос как это дело сохранить? Пробовал FileClose и FileSave но вроде не в ту сторону шагаю.
0
Практикантроп
4679 / 2599 / 496
Регистрация: 23.09.2011
Сообщений: 5,579
29.04.2012, 23:06 8
если имеется в виду текст в мэмо, то несложно:
C++
1
Memo1->Lines->SaveToFile("file.ext");
1
11 / 11 / 1
Регистрация: 01.12.2011
Сообщений: 157
Записей в блоге: 2
29.04.2012, 23:09  [ТС] 9
nick42, Ну да обратно сохранить с изменением. Всего лишь имя текстуры сменили.
0
11 / 11 / 1
Регистрация: 01.12.2011
Сообщений: 157
Записей в блоге: 2
29.04.2012, 23:31  [ТС] 10
Что-то не то, 3d редактор матерится не хочет грузить. Кстати я заметил что чуть чуть не так загружается: вместо пробелов появляются буквы "я".
Hex редактирование - замена строк в файле
0
Практикантроп
4679 / 2599 / 496
Регистрация: 23.09.2011
Сообщений: 5,579
29.04.2012, 23:35 11
а файлы сложной структуры в блокноте править нельзя, - он только на тексты рассчитан (как и мэмо). Я считаю, что лучше использовать FStream и бинарный буфер; если заменяемый фрагмент одной длины с заменяющим, то трудностей вообще минимум.
0
11 / 11 / 1
Регистрация: 01.12.2011
Сообщений: 157
Записей в блоге: 2
29.04.2012, 23:44  [ТС] 12
Так и есть длина одинакова, иначе вылет движка, поэтому просто приходится заменять последний символ.
"FStream и бинарный буфер" можно поподробней?
0
Практикантроп
4679 / 2599 / 496
Регистрация: 23.09.2011
Сообщений: 5,579
30.04.2012, 00:17 13
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void __fastcall TForm1::Button2Click(TObject *Sender)
{
       int fl = FileOpen(".\\wpn_abakan_hud.ogf",fmOpenReadWrite);
       UINT dlf = FileSeek(fl,0,2);
       UCHAR *dbuf = new UCHAR[dlf+1];
       FileSeek(fl,0,0);
       int dlf2 = FileRead(fl,dbuf,dlf);
     {  /*  ìàíèïóëÿöèè ïî ïîèñêó è çàìåíå  */  }
       if (FileSeek(fl,0,0)>=0)
          FileWrite(fl,dbuf,dlf);
       FileClose(fl);
       delete dbuf;
 
       Memo1->Lines->Add(IntToStr(dlf2)) ;
}
1
11 / 11 / 1
Регистрация: 01.12.2011
Сообщений: 157
Записей в блоге: 2
30.04.2012, 13:27  [ТС] 14
nick42, Посоветовали немного изменить код так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    void __fastcall TForm1::Button2Click(TObject *Sender)
if (OpenDialog1->Execute()) {
           int fl = FileOpen(OpenDialog1->FileName,fmOpenReadWrite);
           UINT dlf = FileSeek(fl,0,2);
           char *dbuf = new char[dlf+1];
           char *s = "act_arm_perchatka";
           char *ps = dbuf;
           FileSeek(fl,0,0);
           int dlf2 = FileRead(fl,dbuf,dlf);
           while ((ps = strstr(ps, s)) != NULL) {
           Memo1->Lines->Add("Проверка, внутри while ли мы вообще?");
                *(ps+16) = '1';
                ps++;
           }
           if (FileSeek(fl,0,0)>=0)
              FileWrite(fl,dbuf,dlf);
           FileClose(fl);
           delete dbuf;
 
           Memo1->Lines->Add(IntToStr(dlf2)) ;
    }
    }
Я так понял редактируется сам исходник. И уже ничего сохранять не нужно. Но в исходнике изменения не произошли. Судя по проверке внутрь в while так и не заходит, т. к. в Memo1 не выдаёт строку "Проверка, внутри while ли мы вообще?".

Добавлено через 34 минуты
Нашёл ошибку осталось решить: dbuf принимает значение '\0' 0 (0x00), а ведь это структура файла и значение хоть как должно быть длинное и большое.
0
Практикантроп
4679 / 2599 / 496
Регистрация: 23.09.2011
Сообщений: 5,579
30.04.2012, 14:32 15
no comments...
Вы можете написать цикл последовательного сравнения буфера dbuf со всеми символами строки в Edit1 и в случае полного совпадения - замена найденного фрагмента (в dbuf) с соответствующими символами из строки Edit2 ?
0
11 / 11 / 1
Регистрация: 01.12.2011
Сообщений: 157
Записей в блоге: 2
30.04.2012, 17:41  [ТС] 16
Сработало!
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
        void __fastcall TForm1::Button2Click(TObject *Sender)
        {
               int fl = FileOpen(".\\wpn_abakan_hud.ogf",fmOpenReadWrite);
               UINT dlf = FileSeek(fl,0,2);
               char *dbuf = new char[dlf+1]; // указатель на ANSI-строку длиной dif+1
               char *s = "act_arm_perchatka"; // ANSI-строка которую необходимо найти
               FileSeek(fl,0,0);
               int dlf2 = FileRead(fl,dbuf,dlf);
               int len = strlen(s);
               for (int i=0; i<dlf; i++) {
                    if (dbuf[i] == s[0]) {
                        for (int j=1; j<len && (i+j)<dlf; j++) {
                            if (dbuf[i+j] != s[j])
                                break;
                            else if (j == len-1)
                                dbuf[i+j] = '1';
                        }
                    }
               }
               if (FileSeek(fl,0,0)>=0)
                  FileWrite(fl,dbuf,dlf);
               FileClose(fl);
               delete[] dbuf;
 
               Memo1->Lines->Add(IntToStr(dlf2)) ;
        }
Всем большое спасибо!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.04.2012, 17:41

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Редактирование строк в одном файле и перезапись их в другой
Помогите, пожалуйста, с заданием. Задание: «Составляющее текстового файла f, поделенное на...

Работа с файлами. Удаление и редактирование строк в бинарном файле
Имеется вот такое задание: Дан файл, содержащий сведения о вступительных экзаменах в ВУЗ по...

Замена строк в файле
Добрый день! Я новичок, только что зарегистрировался на форуме. Помогите пожалуйста решить такую...

Замена строк в файле
Здравствуйте. Помогите плз. Есть скрипт который собирает маки и ложит в файл. Файл получается...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.