Ver Mensaje Individual
  #41  
Antiguo 11-05-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Reputación: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
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
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

// Cambia n ocurrencias de una cadena Hex por una nueva cadena Hex en un archivo
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;

// Sustituye en un Offset de archivo una cadena Hex
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;

// Cambia n ocurrencias de una cadena Hex por una nueva cadena Hex en un archivo
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;

// Sustituye en un Offset de archivo una cadena Hex
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.
Responder Con Cita