elmago00,
Cita:
Empezado por elmago00
...este es tu código que trato de usar sin el control...la idea es modificar el archivo sin visualizarlo...así la corrección en el inChipset.bin se hace mas rápido...
|
Revisa este código:
Código Delphi
[-]
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes,
System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs,
FMX.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
function ChangeFileHex(OldHex, NewHex, FileName : String) : Boolean;
var
F1, F2 : TFileStream;
Buffer : Array of Byte;
AuxHex : String;
i,p : Integer;
begin
try
F1 := TFileStream.Create(FileName, fmOpenRead);
F2 := TFileStream.Create(ChangeFileExt(FileName,'.new'), fmCreate);
SetLength(Buffer, Length(OldHex) div 2);
while F1.Position < F1.Size do
begin
F1.Read(Buffer[0], Length(Buffer));
AuxHex := EmptyStr;
for i := Low(Buffer) to High(Buffer) do
AuxHex := AuxHex + IntToHex(Buffer[i],2);
if OldHex = AuxHex then
begin
p := 1;
i := 0;
while p <= Length(NewHex) do
begin
Buffer[i] := StrToInt('$' + Copy(NewHex,p,2));
Inc(p,2);
Inc(i,1);
end;
F2.Write(Buffer[0], Length(Buffer));
end
else
F2.Write(Buffer[0], Length(Buffer));
end;
F1.Free;
F2.Free;
Result := True;
except
F1.Free;
F2.Free;
Result := False;
end;
end;
function ChangeFileOffset(Offset : Integer; NewHex, FileName : String) : Boolean;
var
F1, F2 : TFileStream;
Buffer : Array of Byte;
AuxHex : String;
i,p : Integer;
CurrOffset,Step : Integer;
begin
try
F1 := TFileStream.Create(FileName, fmOpenRead);
F2 := TFileStream.Create(ChangeFileExt(FileName,'.new'), fmCreate);
Step := Length(NewHex) div 2;
SetLength(Buffer, Step);
CurrOffset := 0;
while F1.Position < F1.Size do
begin
F1.Read(Buffer[0], Length(Buffer));
if Offset = CurrOffset then
begin
p := 1;
i := 0;
while p <= Length(NewHex) do
begin
Buffer[i] := StrToInt('$' + Copy(NewHex,p,2));
Inc(p,2);
Inc(i,1);
end;
F2.Write(Buffer[0], Length(Buffer));
end
else
F2.Write(Buffer[0], Length(Buffer));
Inc(CurrOffset, Step);
end;
F1.Free;
F2.Free;
Result := True;
except
F1.Free;
F2.Free;
Result := False;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
OldHex, NewHex, Filename : String;
begin
OldHex := '671254437573746F6D466F726D2E4C6F';
NewHex := 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF';
FileName := 'C:\Developers\Delphi XE4\Test-17 (ChangeFileHex)\FileTest.dcu';
if ChangeFileHex(OldHex,NewHex,Filename) then
MessageDlg('Cambio de Archivo Realizado', TMsgDlgType.mtInformation,[TMsgDlgBtn.mbOk],0)
else
MessageDlg('Error en Cambio de Archivo', TMsgDlgType.mtError,[TMsgDlgBtn.mbOk],0);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Offset : Integer;
NewHex, Filename : String;
begin
Offset := 480;
NewHex := 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
FileName := 'C:\Developers\Delphi XE4\Test-17 (ChangeFileHex)\FileTest.dcu';
if ChangeFileOffset(Offset,NewHex,Filename) then
MessageDlg('Cambio de Archivo Realizado', TMsgDlgType.mtInformation,[TMsgDlgBtn.mbOk],0)
else
MessageDlg('Error en Cambio de Archivo', TMsgDlgType.mtError,[TMsgDlgBtn.mbOk],0);
end;
end.
El código anterior en Delphi XE4 (FireMonkey) bajo Windows 7 Professional x32,
permite cambiar una cadena hexadecimal en un archivo por medio de dos funciones:
1-
Función ChangeFileHex:
Cambia n ocurrencias de una cadena hexadecimal por una nueva cadena hexadecimal en un archivo dado y salva los cambios en un nuevo archivo del mismo nombre del original con extensión .new, en el mismo directorio del archivo de entrada.
2-
Función ChangeFileOffset:
Sustituye en un Offset (Dirección en Decimal) de un archivo dado una cadena hexadecimal y salva los cambios en un nuevo archivo del mismo nombre del original con extensión .new, en el mismo directorio del archivo de entrada.
Los Bytes Per Row (BPF) de ambas funciones están en función de la longitud de la cadenas de entrada OldHex (
Función ChangeFileHex) y NewHex (
Función ChangeFileOffset), siendo importante recordar que
ambas cadenas deben ser del mismo tamaño en las funciones mencionadas.
Nota: Las dos funciones anteriores
leen y modifican los archivos de entrada y salida directamente en disco, lo cual les permite procesar archivos de cualquier tamaño, limitados solo por las características del Sistema de Archivos del Sistema Operativo
de forma rápida y eficiente e independientemente de cualquier componente de Delphi, funcionado correctamente según lo esperado en las pruebas realizadas.
Espero sea útil
Nelson.