Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
5 / 5 / 2
Регистрация: 25.01.2015
Сообщений: 134

Нужно заменить значения в 16-ричном коде

26.01.2015, 00:04. Показов 4826. Ответов 53
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Передо мной стоит задача, мне надо в определённом файле, при нажатии на кнопку заменить несколько байтов, как это сделать я не имею не малейшего понятия, много лазил в интернете, нечего не нашёл. Я вообще не как не могу понять как работать с байтами. Помогите я уже устал искать.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.01.2015, 00:04
Ответы с готовыми решениями:

Замена символов в 16-ричном HEX коде программы
Всем привет! Ребята Хелп подскажите пожалуйста как заменить какой командой вот эти три позиции с того что там на скрине в красных...

Нужно чтобы на экран числа выводились в 16-ричном формате
В кратце: пишу CAN-месенджер в принципе он работает, но есть одно НО. Мне нужно чтобы на экран числа выводились в 16-ричном формате. Ниже...

В 16-ричном числе выделить маской старший разряд и заменить его предопределенным числом
Как в 16ричном числе выделить маской старший разряд и заменить его предопределенным числом? То есть есть 0x0000c1a5 и число 8, нужно...

53
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
30.01.2015, 12:02
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Kaylan Посмотреть сообщение
А можно ли как нибудь все найденные файлы загрузить так что бы это вообще не было видно например в стринглист или куда ещё.
Чтобы в ProcFile() отключить вывод в список надо через параметр aSl передать значение NIL. Если вывод в список вообще не понадобится, то можно переделать так:
Delphi
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
uses
  FileCtrl, StrUtils;
 
{Функция выполняет поиск в файле aFileName заданной цепочки байт aSf и запись
на найденных позициях заменяющей цепочки байт aSr.
При успешном выполнении функция возвращает значение = True, иначе - False.}
function ProcFile(const aFileName : String; const aSf, aSr : AnsiString) : Boolean;
const
  SelfName = 'ProcFile()';
  //Размер буфера в байтах. Этот размер не должен быть меньше размера искомой подстроки.
  SizeBuff = 1000000;
var
  Fs : TFileStream;
  SBuff : AnsiString; //AnsiString - тип, описывающий строку однобайтных символов.
  FOffs, Offs, SizeRes : Int64;
begin
  Result := False;
  //Проверки.
  if Length(aSf) <> Length(aSr) then
    raise Exception.Create(SelfName + '. Длины aSf и aSr отличаются.');
  if SizeBuff < Length(aSf) then
    raise Exception.Create(SelfName + '. Размер буфера меньше длины aSf.');
 
  try
    //Создаём экземпляр файлового потока и открываем файл в режиме чтения и записи
    //(fmOpenReadWrite), с запретом на запись из других процессов (fmShareDenyWrite).
    Fs := TFileStream.Create(aFileName, fmOpenReadWrite + fmShareDenyWrite);
    //Обработка данных потока (файла).
    try
      SetLength(SBuff, SizeBuff); //Выделяем память для буфера.
      FOffs := 0; //Смещение указателя потока до чтения очередного блока данных.
      repeat
        SizeRes := Fs.Read(SBuff[1], SizeBuff); //Загружаем в буфер данные файлового потока.
        if SizeRes < SizeBuff then //Если в буфер загружено менее, чем SizeBuff байт (при достижении конца потока).
          SetLength(SBuff, SizeRes); //Изменяем размер буфера в соответствии с количеством загруженных байт.
        //Поиск в буфере.
        Offs := PosEx(aSf, SBuff, 1) - 1; //Смещение искомой подстроки в буфере.
        while Offs > -1 do
        begin
          Fs.Position := FOffs + Offs; //Перемещаем указатель потока к найденной подстроке.
          Fs.Write(aSr[1], Length(aSr)); //Записываем новую последовательность байтов.
          Offs := PosEx(aSf, SBuff, Offs + 2) - 1; //Продолжаем поиск в буфере со следующей позиции.
        end;
        FOffs := FOffs + SizeRes; //Смещение указателя потока с учётом последнего прочитанного блока.
        if FOffs < Fs.Size then   //Если пока не дошли до конца файла.
          Dec(FOffs, Length(aSf) - 1); //Откатываем смещение к неисследованной области.
        Fs.Position := FOffs;
      until Fs.Position = Fs.Size; //Прекращаем поиск, если достигли конца потока.
    finally
      FreeAndNil(Fs); //Уничтожаем экземпляр файлового потока и закрываем файл.
    end;
  except
    Exit;
  end;
 
  Result := True;
end;
 
{Функция в заданном директории aPath (и во всех вложенных директориях, при aSubDir = True)
находит файлы по заданной маске aMask и в найденных файлах выполняет замену всех
вхождений цепочки байт aSf на цепочку aSr.
Функция возвращает значение = True, если ошибок не было. В противном случае - False.
Если маска не задана, то будет использована маска = '*'.
aErrList - в этот список выводятся пути файлов, при обработке которых возникли ошибки.
Если aErrList = NIL, то список не формируется.
aSubDir - True, если надо обработать вложенные директории, False - иначе.}
function ProcDir(const aPath, aMask : String; const aSf, aSr : AnsiString;
  const aErrList : TStrings; const aSubDir : Boolean) : Boolean;
var
  Path, Mask : String;
  Srch : TSearchRec;
  Attr : Integer;
begin
  Result := True;
  //Добавляем в конец строки слеш, если его нет.
  Path := IncludeTrailingPathDelimiter(aPath);
  //Маска.
  if aMask <> '' then
    Mask := aMask
  else
    Mask := '*';
 
  //В текущем директории ищем файлы по заданной маске.
  Attr := faAnyFile - faVolumeID - faDirectory;
  if FindFirst(Path + Mask, Attr, Srch) = 0 then
  try
    repeat
      //Обработка файла.
      if not ProcFile(Path + Srch.Name, aSf, aSr) then //Если при обработке возникли ошибки.
      begin
        Result := False;
        if Assigned(aErrList) then //Если задан список.
          aErrList.Add(Path + Srch.Name); //В случае ошибки записываем в список путь к файлу.
      end;
    until FindNext(Srch) <> 0;
  finally
    FindClose(Srch);
  end;
 
  if aSubDir then //Если нужно обработать вложенные директории.
  begin
    //В текущем директории ищем все вложенные директории и для каждого из них выполняем рекурсивный вызов.
    Attr := faDirectory;
    if FindFirst(Path + '*', Attr, Srch) = 0 then
    try
      repeat
        if (Srch.Attr and Attr = Attr) and (Srch.Name <> '.') and (Srch.Name <> '..') then
          if not ProcDir(Path + Srch.Name, Mask, aSf, aSr, aErrList, aSubDir) then
            Result := False;
      until FindNext(Srch) <> 0;
    finally
      FindClose(Srch);
    end;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  S, Path, Mask : String;
  Sf, Sr : AnsiString;
  ErrList : TStringList;
begin
  //Директорий, в котором лежит исполняемый файл программы.
  Path := ExtractFilePath(ParamStr(0));
  //Диалог выбора директория.
  if not SelectDirectory('Выбор папки', '', Path) then
    Exit;
  {
  if not SelectDirectory(Path, [sdAllowCreate, sdPerformCreate, sdPrompt], 0) then
    Exit;
  }
  //Проверка существования директория.
  if not DirectoryExists(Path) then
  begin
    MessageBox(Handle, 'Заданная папка не найдена. Действие отменено.', 'Отмена!',
      MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
 
  //Маска имён файлов.
  Mask := Edit1.Text;
  if Mask = '' then
    Mask := '*';
 
  {Искомая и заменяющая цепочки байт. Они должны быть заданы в виде шестнадцатиричных
  кодов. Каждый байт должен быть пердставлен двумя шестнадцатиричными цифрами.
  Запись должна быть без пробелов и состоять только из шестнадцатиричных цифр.
  Пример: 4B4C4D4E Этому значению, согласно таблице ASCII соответствует строка: KLMN }
 
  //Искомая цепочка байт.
  S := Edit2.Text;
  SetLength(Sf, Length(S) div 2);
  HexToBin(PChar(S), PAnsiChar(Sf), Length(Sf));
  //Заменяющая цепочка байт.
  S := Edit3.Text;
  SetLength(Sr, Length(S) div 2);
  HexToBin(PChar(S), PAnsiChar(Sr), Length(Sr));
 
  //Проверки.
  if Length(Sf) <> Length(Sr) then
  begin
    MessageBox(Handle, 'Длины искомой и заменяющей цепочек различны. Действие отменено.',
      'Отмена!', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
  if Sf = '' then
  begin
    MessageBox(Handle, 'Искомая цепочка не задана. Действие отменено.',
      'Отмена!', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
 
  Memo1.Text := 'Начальный директорий: ' + Path;
  Memo1.Lines.Add('Маска: "' + Mask + '"');
  Memo1.Lines.Add('Искомая цепочка байт, HEX:'#9 + Edit2.Text);
  Memo1.Lines.Add('Заменяющая цепочка байт, HEX:'#9 + Edit3.Text);
 
  {Без вывода в список сведений о файлах, при обработке которых возникли ошибки.
  //Поиск и обработка файлов.
  if ProcDir(Path, Mask, Sf, Sr, nil, True) then
    Memo1.Lines.Add('Обработка успешно выполнена.')
  else
    Memo1.Lines.Add('Во время обработки возникли ошибки!');
  //}
 
  //{С выводом в список сведений о файлах, при обработке которых возникли ошибки.
  ErrList := TStringList.Create;
  try
    ProcDir(Path, Mask, Sf, Sr, ErrList, True); //Поиск и обработка файлов.
    if ErrList.Count = 0 then
      Memo1.Lines.Add('Обработка успешно выполнена.')
    else
    begin
      Memo1.Lines.Add('Во время обработки возникли ошибки!');
      Memo1.Lines.Add('Список файлов, при обработке которых возникли ошибки:');
      Memo1.Lines.AddStrings(ErrList);
    end;
    Memo1.Lines.Add('----------');
  finally
    FreeAndNil(ErrList);
  end;
  //}
end;
 
end.
Здесь процедура ProcDir() выводит в список aErrList имена файлов, при обработке которых были ошибки.
Если aErrList = NIL, то вывод в список не производится.
1
5 / 5 / 2
Регистрация: 25.01.2015
Сообщений: 134
30.01.2015, 15:39  [ТС]
Цитата Сообщение от Mawrat Посмотреть сообщение
if not SelectDirectory('Выбор папки', '', Path) then
* * Exit;
* {
* if not SelectDirectory(Path, [sdAllowCreate, sdPerformCreate, sdPrompt], 0) then
* * Exit;
Ругается вот здесь вроде папку я указал, а он ругается.
0
пофигист широкого профиля
4770 / 3206 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
30.01.2015, 16:22
Цитата Сообщение от Kaylan Посмотреть сообщение
вроде папку я указал
Что значит указал?
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
30.01.2015, 20:14
Вот этот проект (с последней версией кода).
Вложения
Тип файла: 7z SearchAndProcFiles-02.7z (163.2 Кб, 5 просмотров)
0
5 / 5 / 2
Регистрация: 25.01.2015
Сообщений: 134
30.01.2015, 21:05  [ТС]
Я тут немного подправлял, может и зря, но выдаёт такие ошибки.
[Ошибка] Unit1.pas(46): Undeclared identifier: 'PosEx'
[Предупреждение] Unit1.pas(85): Symbol 'faVolumeID' is specific to a platform
[Ошибка] Unit1.pas(129): Undeclared identifier: 'SelectDirectory'
[Фатальная Ошибка] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
0
пофигист широкого профиля
4770 / 3206 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
30.01.2015, 21:32
Цитата Сообщение от Kaylan Посмотреть сообщение
Undeclared identifier: 'SelectDirectory'
Delphi
1
uses FileCtrl;
Цитата Сообщение от Kaylan Посмотреть сообщение
Undeclared identifier: 'PosEx'
Если Делфи выше чем Д7, то
Delphi
1
uses StrUtils;
0
5 / 5 / 2
Регистрация: 25.01.2015
Сообщений: 134
31.01.2015, 12:56  [ТС]
Цитата Сообщение от northener Посмотреть сообщение
Сообщение от Kaylan
Undeclared identifier: 'SelectDirectory'
Код Delphi
1
uses FileCtrl;
А можно ли так сделать что бы не указывать директорию самому а что бы она была уже указана в программе?
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
31.01.2015, 14:50
Цитата Сообщение от Kaylan Посмотреть сообщение
А можно ли так сделать что бы не указывать директорию самому а что бы она была уже указана в программе?
Можно. Для этого надо в коде последней версии проекта (код, архив) в строке №156 записать нужный путь:
Delphi
155
156
  //ExtractFilePath(ParamStr(0)) - путь к директорию, в котором лежит исполняемый файл программы.
  Path := ExtractFilePath(ParamStr(0)) + '\Files\';
И надо закомментовать строки №158-159:
Delphi
157
158
159
  //Диалог выбора директория.
  //if not SelectDirectory('Выбор папки', '', Path) then
  //  Exit;
0
5 / 5 / 2
Регистрация: 25.01.2015
Сообщений: 134
31.01.2015, 17:42  [ТС]
Что здесь не так? уже всё просмотрел, программа просто нечего не делает. Вот код. P.S Я убрал отсюда только проверки.
Delphi
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
unit Unit5;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, StrUtils;
 
type
  TForm1 = class(TForm)
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    procedure RadioButton1Click(Sender: TObject);
    procedure RadioButton2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
function ProcFile(const aFileName : String; const aSf, aSr : AnsiString) : Boolean;
const
  SelfName = 'ProcFile()';
  SizeBuff = 1000000;
var
  Fs : TFileStream;
  SBuff : AnsiString;
  FOffs, Offs, SizeRes : Int64;
begin
  Result := False;
try
    Fs := TFileStream.Create(aFileName, fmOpenReadWrite + fmShareDenyWrite);
    try
      SetLength(SBuff, SizeBuff);
      FOffs := 0;
      repeat
        SizeRes := Fs.Read(SBuff[1], SizeBuff);
        if SizeRes < SizeBuff then
          SetLength(SBuff, SizeRes);
        Offs := PosEx(aSf, SBuff, 1) - 1;
        while Offs > -1 do
        begin
          Fs.Position := FOffs + Offs;
          Fs.Write(aSr[1], Length(aSr));
          Offs := PosEx(aSf, SBuff, Offs + 2) - 1;
        end;
        FOffs := FOffs + SizeRes;
        if FOffs < Fs.Size then
          Dec(FOffs, Length(aSf) - 1);
        Fs.Position := FOffs;
      until Fs.Position = Fs.Size;
    finally
      FreeAndNil(Fs);
    end;
  except
    Exit;
  end;
 
  Result := True;
end;
 
function ProcDir(const aPath, aMask : String; const aSf, aSr : AnsiString;
  const aErrList : TStrings; const aSubDir : Boolean) : Boolean;
var
  Path, Mask : String;
  Srch : TSearchRec;
  Attr : Integer;
begin
  Result := True;
  //Äîáàâëÿåì â êîíåö ñòðîêè ñëåø, åñëè åãî íåò.
  Path := IncludeTrailingPathDelimiter(aPath);
  //Ìàñêà.
  if aMask <> '' then
    Mask := aMask
  else
    Mask := '*.map';
 
  //Â òåêóùåì äèðåêòîðèè èùåì ôàéëû ïî çàäàííîé ìàñêå.
  Attr := faAnyFile - faDirectory;
  if FindFirst(Path + Mask, Attr, Srch) = 0 then
  try
    repeat
      //Îáðàáîòêà ôàéëà.
      if not ProcFile(Path + Srch.Name, aSf, aSr) then //Åñëè ïðè îáðàáîòêå âîçíèêëè îøèáêè.
      begin
        Result := False;
        if Assigned(aErrList) then //Åñëè çàäàí ñïèñîê.
          aErrList.Add(Path + Srch.Name); // ñëó÷àå îøèáêè çàïèñûâàåì â ñïèñîê ïóòü ê ôàéëó.
      end;
    until FindNext(Srch) <> 0;
  finally
    FindClose(Srch);
  end;
 
  if aSubDir then //Åñëè íóæíî îáðàáîòàòü âëîæåííûå äèðåêòîðèè.
  begin
    //Â òåêóùåì äèðåêòîðèè èùåì âñå âëîæåííûå äèðåêòîðèè è äëÿ êàæäîãî èç íèõ âûïîëíÿåì ðåêóðñèâíûé âûçîâ.
    Attr := faDirectory;
    if FindFirst(Path + '.map', Attr, Srch) = 0 then
    try
      repeat
        if (Srch.Attr and Attr = Attr) and (Srch.Name <> '.') and (Srch.Name <> '..') then
          if not ProcDir(Path + Srch.Name, Mask, aSf, aSr, aErrList, aSubDir) then
            Result := False;
      until FindNext(Srch) <> 0;
    finally
      FindClose(Srch);
    end;
  end;
end;
 
 
 
procedure TForm1.RadioButton1Click(Sender: TObject);
var
  S, Path, Mask : String;
  Sf, Sr : AnsiString;
 
begin
  //Äèðåêòîðèé, â êîòîðîì ëåæèò èñïîëíÿåìûé ôàéë ïðîãðàììû.
  Path := ExtractFilePath(ParamStr(0))+'\maps\';
  //Äèàëîã âûáîðà äèðåêòîðèÿ.
  {
  if not SelectDirectory(Path, [sdAllowCreate, sdPerformCreate, sdPrompt], 0) then
    Exit;
  }
  //Ïðîâåðêà ñóùåñòâîâàíèÿ äèðåêòîðèÿ.
  if not DirectoryExists(Path) then
  begin
    MessageBox(Handle, 'Çàäàííàÿ ïàïêà íå íàéäåíà. Äåéñòâèå îòìåíåíî.', 'Îòìåíà!',
      MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
 
  //Ìàñêà èì¸í ôàéëîâ.
  Mask := '';
  if Mask = '' then
    Mask := '.map';
 
  {Èñêîìàÿ è çàìåíÿþùàÿ öåïî÷êè áàéò. Îíè äîëæíû áûòü çàäàíû â âèäå øåñòíàäöàòèðè÷íûõ
  êîäîâ. Êàæäûé áàéò äîëæåí áûòü ïåðäñòàâëåí äâóìÿ øåñòíàäöàòèðè÷íûìè öèôðàìè.
  Çàïèñü äîëæíà áûòü áåç ïðîáåëîâ è ñîñòîÿòü òîëüêî èç øåñòíàäöàòèðè÷íûõ öèôð.
  Ïðèìåð: 4B4C4D4E Ýòîìó çíà÷åíèþ, ñîãëàñíî òàáëèöå ASCII ñîîòâåòñòâóåò ñòðîêà: KLMN }
 
  //Èñêîìàÿ öåïî÷êà áàéò.
  S := '000000020000000300000004000000010000006';
  SetLength(Sf, Length(S) div 2);
  HexToBin(PChar(S), PAnsiChar(Sf), Length(Sf));
  //Çàìåíÿþùàÿ öåïî÷êà áàéò.
  S := '000000010000000300000004000000020000006';
  SetLength(Sr, Length(S) div 2);
  HexToBin(PChar(S), PAnsiChar(Sr), Length(Sr));
end;
 
procedure TForm1.RadioButton2Click(Sender: TObject);
var
  S, Path, Mask : String;
  Sf, Sr : AnsiString;
 
begin
  //Äèðåêòîðèé, â êîòîðîì ëåæèò èñïîëíÿåìûé ôàéë ïðîãðàììû.
  Path := ExtractFilePath(ParamStr(0))+'\maps\';
  //Äèàëîã âûáîðà äèðåêòîðèÿ.
  {
  if not SelectDirectory(Path, [sdAllowCreate, sdPerformCreate, sdPrompt], 0) then
    Exit;
  }
  //Ïðîâåðêà ñóùåñòâîâàíèÿ äèðåêòîðèÿ.
  if not DirectoryExists(Path) then
  begin
    MessageBox(Handle, 'Çàäàííàÿ ïàïêà íå íàéäåíà. Äåéñòâèå îòìåíåíî.', 'Îòìåíà!',
      MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
 
  //Ìàñêà èì¸í ôàéëîâ.
  Mask := '';
  if Mask = '' then
    Mask := '.map';
 
  {Èñêîìàÿ è çàìåíÿþùàÿ öåïî÷êè áàéò. Îíè äîëæíû áûòü çàäàíû â âèäå øåñòíàäöàòèðè÷íûõ
  êîäîâ. Êàæäûé áàéò äîëæåí áûòü ïåðäñòàâëåí äâóìÿ øåñòíàäöàòèðè÷íûìè öèôðàìè.
  Çàïèñü äîëæíà áûòü áåç ïðîáåëîâ è ñîñòîÿòü òîëüêî èç øåñòíàäöàòèðè÷íûõ öèôð.
  Ïðèìåð: 4B4C4D4E Ýòîìó çíà÷åíèþ, ñîãëàñíî òàáëèöå ASCII ñîîòâåòñòâóåò ñòðîêà: KLMN }
 
  //Èñêîìàÿ öåïî÷êà áàéò.
  S := '000000010000000300000004000000020000006';
  SetLength(Sf, Length(S) div 2);
  HexToBin(PChar(S), PAnsiChar(Sf), Length(Sf));
  //Çàìåíÿþùàÿ öåïî÷êà áàéò.
  S := '000000020000000300000004000000010000006';
  SetLength(Sr, Length(S) div 2);
  HexToBin(PChar(S), PAnsiChar(Sr), Length(Sr));
end;
 
end.
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
31.01.2015, 18:09
Надо вызвать функцию ProcDir(). Именно она ищет и обрабатывает файлы.
Delphi
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
  //Искомая цепочка байт.
  S := '000000020000000300000004000000010000006';
  SetLength(Sf, Length(S) div 2);
  HexToBin(PChar(S), PAnsiChar(Sf), Length(Sf));
  //Заменяющая цепочка байт.
  S := '000000010000000300000004000000020000006';
  SetLength(Sr, Length(S) div 2);
  HexToBin(PChar(S), PAnsiChar(Sr), Length(Sr));
 
  //Поиск и обработка файлов.
  if ProcDir(Path, Mask, Sf, Sr, nil, True) then
    Memo1.Lines.Add('Обработка успешно выполнена.')
  else
    Memo1.Lines.Add('Во время обработки возникли ошибки!');
end;
Добавлено через 3 минуты
Или без вывода в Memo, можно показывать сообщения через вызов ShowMessage():
Delphi
161
162
163
164
165
166
  //Поиск и обработка файлов.
  if ProcDir(Path, Mask, Sf, Sr, nil, True) then
    ShowMessage('Обработка успешно выполнена.')
  else
    ShowMessage('Во время обработки возникли ошибки!');
end;
0
5 / 5 / 2
Регистрация: 25.01.2015
Сообщений: 134
31.01.2015, 19:26  [ТС]
Не чего не меняет, я остальное всё правильно указал? Так вот объясню, что именно я добиваюсь. У меня лежит проект (например назовем, мм) в папке "1" в этой папке "1" есть папка "maps", в папке "maps" есть 50 файлов с расширением ".map". У меня есть две кнопки RadioButton первая кнопка должна менять байты всех файлов в папке "maps" с расширением ".map" с 000000020000000300000040000000100000006 на 000000010000000300000040000000200000006 вторая также должна менять байты всех файлов в папке "maps" с расширением ".map" с 000000010000000300000040000000200000006 на 000000020000000300000040000000100000006
то есть получается так: одна кнопка меняет байты а другая возвращает всё в первоначальное положение. Как-то так извините если достал но не чего не выходит(ю
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
31.01.2015, 21:01
Цитата Сообщение от Kaylan Посмотреть сообщение
Не чего не меняет, я остальное всё правильно указал?
Это мой недосмотр - в посте №28 я лишний слеш приписал перед словом Files. Для исправления надо в коде из поста №29 заменить строку '\maps\' на 'maps\':
Delphi
1
2
  //Путь к директорию "maps\", который вложен в тот директорий, где лежит исполняемый файл программы.
  Path := ExtractFilePath(ParamStr(0))+'maps\';
Всё должно заработать.

Добавлено через 12 минут
И ещё строки, которые задают искомую и замещающую цепочки байт, заданы не совсем верно. В них нечётное количество цифр. Например, строка, задающая искомую цепочку байт:
Code
1
000000020000000300000040000000100000006
Здесь нечётное количество цифр - 39. При составлении цепочки байт будет взято 38 цифр - 19 байт. Если надо 20 байт получить, то следует дописать ещё одну цифру в строке. Например, так:
Code
1
0000000200000003000000400000001000000060
1
5 / 5 / 2
Регистрация: 25.01.2015
Сообщений: 134
31.01.2015, 23:28  [ТС]
Да! да! спасибо ты мне так помог спасибо огромное всё заработало, блин так рад, я сильно тебе благодарен!

Добавлено через 17 минут
А что это такое?
Ошибка: PS Извините что на другой ресурс ссылку даю просто не знаю как тут вставлять картинки)
http://imglink.ru/show-image.p... 5b6c32cbd7
0
пофигист широкого профиля
4770 / 3206 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
01.02.2015, 01:43
Цитата Сообщение от Kaylan Посмотреть сообщение
А что это такое?

Не по теме:

Это страшный зверь, любимая пища которого неграмотные программисты. :)


Если хочешь досконально разобраться, читай
Access Violation в деталях
Если не хочешь читать и разбираться, выкладывай свой проект.
Mawrat, уже так завяз в этом топике, что наверняка поможет!
Под окном для ввода сообщения есть кнопка "Расширенный режим". Она поможет тебе и картинку вставить и проект(Запакованный разумеется).
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
01.02.2015, 10:38
Цитата Сообщение от northener Посмотреть сообщение
Mawrat, уже так завяз в этом топике, что наверняка поможет!
Да, тему я уж не заброшу.
Цитата Сообщение от Kaylan Посмотреть сообщение
А что это такое?
По Access Violation northener уже дал ссылку. Такая ошибка возникает, если произошла попытка чтения или записи в области памяти, которая не принадлежит программе.

Ещё на счёт масок.
Цитата Сообщение от Kaylan Посмотреть сообщение
Delphi
142
143
144
145
  //Маска имён файлов.
  Mask := '';
  if Mask = '' then
    Mask := '.map';
В маску надо добавить знак '*' и написать так: '*.map':
Delphi
142
143
144
145
  //Маска имён файлов.
  Mask := '*.map';
  if Mask = '' then
    Mask := '*';
Цитата Сообщение от Kaylan Посмотреть сообщение
Delphi
106
    if FindFirst(Path + '.map', Attr, Srch) = 0 then
Вот здесь не надо менять маску - надо оставить, как было раньше: '*'.
Delphi
106
    if FindFirst(Path + '*', Attr, Srch) = 0 then
Потому, что в этой части кода выполняется поиск вложенных директорий, а не файлов. И такие директории должны быть найдены все.

Прикладываю проект с TRadioButton.
Вложения
Тип файла: 7z SearchAndProcFiles. For Kaylan-01.7z (163.7 Кб, 5 просмотров)
0
5 / 5 / 2
Регистрация: 25.01.2015
Сообщений: 134
01.02.2015, 11:08  [ТС]
Да, без звезды не работала, но я уже и сам добавил так как надо, на другом сайте я читал про поиск файлов, там конечно многое не понятно, но это я понял. У меня сначала не заработала, но я понял в чём дело так что). Хм поменял что-то и перестал выдавать Access Violation странно ну да ладною Спасибо вам, извините конечно, но я может показался и не недоразвитым, программистом, но я начинающий, месяц назад только начал учиться.
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
01.02.2015, 12:11
Цитата Сообщение от Kaylan Посмотреть сообщение
Спасибо вам, извините конечно, но я может показался и не недоразвитым, программистом, но я начинающий, месяц назад только начал учиться.
Мне ничего подобного не кажется. По теме чётко видно, что тобой проявлена настойчивость в решении задачи. Это большой плюс. Ты взялся за задачу, которая требует больше умений, чем ты сейчас имеешь. Для решения потребовалось читать новые материалы, разбираться в них и разбираться в кодах, написанных другими людьми. Вот именно в таких обстоятельствах, когда цель выше текущих возможностей, происходит личностный рост. А опыт и понимание придут со временем.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
01.02.2015, 12:31
Цитата Сообщение от Kaylan Посмотреть сообщение
Мне бы для начала хотя бы это сделать"Загрузить определённый отрезок байтов в например мемо" А от этого я уже смог бы отталкиваться.
Не смог бы, так как от решения будешь дальше, чем в самом начале. Загрузить надо не в мемо, а в переменную типа char, или массив charов. Да и то при условии, что тебе нужно их старое значение.
0
пофигист широкого профиля
4770 / 3206 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
01.02.2015, 15:36
Цитата Сообщение от Kaylan Посмотреть сообщение
поменял что-то и перестал выдавать Access Violation странно ну да ладно
То что перестало выдавать AV еще не означает что ошибка исчезла.
0
5 / 5 / 2
Регистрация: 25.01.2015
Сообщений: 134
08.02.2015, 21:35  [ТС]
Вроде пытался менять, но не смог, всё время меняет не так, как вот это всё преобразовать чтобы, происходило при нажатии на кнопку(и выполнялось смотря какая RadioButton выделена). Как во многих программах выделяешь RadioButton и какую ты выделил то и выполняется. Извините если не понятно написал
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.02.2015, 21:35

Вывести в консоль в виде таблицы значения чисел в 16 и 10-ричном формате
Обьясните пожалуйста задание, и как его можно реализовать, выучили указатели. Задание:–виведення на консоль у вигляді таблиці значень...

Нужно заменить тернарный оператор на циклы в готовом коде
Здравствуйте, нужно написать игру с такими условиями :Это игра, в которую могут играть два игрока в начале предлагает ввести никнеймы и они...

Значения в матрице. Нужно разобраться в коде с++ человеку не знающему языка
Добрый день. На просторах интернета нашел программу, она уравнивает химическую реакцию в переданной ей строчке. Написана языке c++ пытаюсь...

Что нужно поменять в коде чтобы значения в матрице были вещественные?
Что нужно поменять в коде чтобы значения в матрице были вещественные? #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include...

Нужно чтобы программа открывала Developer Tool и меняла некоторый значения в коде страницы
Здравствуйте, в браузере Google Chrome есть такая функция, называется она Developer Tool, которая позволяет просматривать исходный код...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru