Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   FireMonkey (https://www.clubdelphi.com/foros/forumdisplay.php?f=50)
-   -   Ayuda a pasar este código a firemonkey. (https://www.clubdelphi.com/foros/showthread.php?t=85794)

nlsgarcia 11-05-2014 05:08:44

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.

elmago00 11-05-2014 07:53:34

Muchas gracias ya esta resuelto todo. finalice el proyecto y mañana lo entrego a la empresa.:)
Gracias Nelson y ecfisa.
^\||/^\||/

nlsgarcia 11-05-2014 08:23:48

elmago00,

Cita:

Empezado por elmago00
...finalice el proyecto y mañana lo entrego a la empresa...

Falta una pequeña corrección :rolleyes:

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;
    BPF, NBR : Integer;  // BPF = Bytes Per Row, NBR = Number of Bytes Read
 
 begin
 
    try
 
       F1 := TFileStream.Create(FileName, fmOpenRead);
       F2 := TFileStream.Create(ChangeFileExt(FileName,'.new'), fmCreate);
 
       BPF := Length(OldHex) div 2;
 
       SetLength(Buffer, BPF);
 
       while F1.Position < F1.Size do
       begin
          NBR := F1.Read(Buffer[0], BPF);
 
          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], NBR);
          end
          else
             F2.Write(Buffer[0], NBR);
       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 : Integer;
    BPF, NBR : Integer;  // BPF = Bytes Per Row, NBR = Number of Bytes Read
 
 begin
 
    try
 
       F1 := TFileStream.Create(FileName, fmOpenRead);
       F2 := TFileStream.Create(ChangeFileExt(FileName,'.new'), fmCreate);
 
       BPF := Length(NewHex) div 2;
 
       SetLength(Buffer, BPF);
 
       CurrOffset := 0;
 
       while F1.Position < F1.Size do
       begin
 
          NBR := F1.Read(Buffer[0], BPF);
 
          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], NBR);
          end
          else
             F2.Write(Buffer[0], NBR);
 
          Inc(CurrOffset, BPF);
       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, es la versión 2 del código del Msg #41 con los siguientes cambios:

1- Optimiza el código y lo hace más legible.

2- Corrige el Número de Bytes a Escribir en función del NBR (Number of Bytes Read) en el caso de que los archivos procesados no sean múltiplos de BPF (Bytes Per Row).

Espero sea útil :)

Nelson.

elmago00 11-05-2014 20:52:56

gracias, lo tendré en cuenta, ya que hoy lo enviare por correo a la empresa. muchas gracias
sin ustedes nunca hubiera solucionado el problema, gracias

elmago00 06-01-2015 06:01:58

Hola Nelson,
Perdona la molestia, pero ahora tengo una pregunta, sera posible cambiar todas las cadenas hexadecimales, que tengan un mismo valor?
es que tu código solo me permite, cambiar una sola linea, pero debo cambiar varias, y con tu código, solo cambia una a la vez.

Gracias por tu respuesta.

nlsgarcia 06-01-2015 09:13:42

elmago00,

Cita:

Empezado por elmago00
...¿Sera posible cambiar todas las cadenas hexadecimales, que tengan un mismo valor?...

:rolleyes:

Revisa la función ChangeFileHex del Msg #43, esta permite cambiar n ocurrencias de una cadena Hex por una nueva cadena Hex en un archivo.

Espero sea útil :)

Nelson.

elmago00 06-01-2015 09:26:59

Si precisamente es la función. Q utilizo.
Seguramente algo no e hecho bien por que solo
Cambia una solí cadena, pero las otras siguen igual.
Es decir si yo tengo 6 cadenas hexadecimales de. 16. Bytes.
Solo cambia la primera cadena de 16 y las demás no.


Volvere a rebisar gracias de nuevo.

elmago00 06-01-2015 20:55:35

no Nelson, sigue cambiando una sola cadena, veras si yo tengo esto.

2D 55 FD 85 CD 22 63 EE ED B7 EE 44 01 DD 44
2D 55 FD 85 CD 22 63 EE ED B7 EE 44 01 DD 44
2D 55 FD 85 CD 22 63 EE ED B7 EE 44 01 DD 44
2D 55 FD 85 CD 22 63 EE ED B7 EE 44 01 DD 44

solo cambia la primera cadena, y a veces la segunda o tercera, pero solo una. las otras siguen igual.

nlsgarcia 06-01-2015 21:12:31

elmago00,

Cita:

Empezado por elmago00
...sigue cambiando una sola cadena...

:rolleyes:

Te comento:

1- Reviso la función ChangeFileHex del Msg #43 y en lo que tenga una respuesta la publico.

2- Te sugiero publicar un link con el archivo que quieres modificar y el detalle de la modificación (Hexadecimal-Anterior y Hexadecimal-Nuevo).

Saludos,

Nelson.

nlsgarcia 07-01-2015 00:36:32

elmago00,

Cita:

Empezado por nlsgarcia
...Reviso la función ChangeFileHex del Msg #43 y en lo que tenga una respuesta la publico...

:rolleyes:

Te comento:

1- Revise la función ChangeFileHex del Msg #43 y funciona correctamente según lo esperado en pruebas realizadas en archivos de texto y binarios.

2- Te sugiero publicar un link con el archivo que quieres modificar y el detalle de la modificación (Hexadecimal-Anterior y Hexadecimal-Nuevo), para poder hacer pruebas con la data real.

Saludos,

Nelson.

elmago00 07-01-2015 06:02:24

1 Archivos Adjunto(s)
lo hago asi
Código Delphi [-]
 
var
    OldHex, NewHex, Filename : String;
 
 begin
OldHex := '35740203652537'; // cadena de 7
   NewHex := '25632322EFDDE7';
   FileName := 'dump.dll';   // 

   if ChangeFileHex(OldHex,NewHex,Filename) then
   begin

  Memo1.Lines.Add('Done!');
 
       end
   else
      begin
      ShowMessage('Error');
 
     end;

el archivo para esta cadena es este:
Archivo Adjunto 3098

y si yo intento cambiar varias cadenas de 16 me cambia solo una, y las otras no.
entre menor es la cadena, mayor es el cambio que hace y viceversa.


gracias por tu tiempo.

elmago00 07-01-2015 08:34:15

Veras que la cadena anterior aparece 6. Veces pero solo cambia 3 cadenas y las otras se mantienen.
Y si cambias cadenas de mayor tamaño solo cambia una.

elmago00 08-01-2015 06:36:20

El silencio. Me hace temer lo peor.
Esta difícil y la vez extraño verdad? Yo llevó 2 semanas y nada.

Disculpa el haberte puesto en este lío Nelson. Agradezco tu ayuda.

nlsgarcia 08-01-2015 10:10:54

elmago00,

Cita:

Empezado por elmago00
...El silencio. Me hace temer lo peor...

:D

En lo que lo tenga listo lo publico, me falta un detalle :rolleyes:

Saludos,

Nelson.

nlsgarcia 08-01-2015 12:58:34

elmago00,

Cita:

Empezado por nlsgarcia
...En lo que lo tenga listo lo publico, me falta un detalle...

:rolleyes:

Revisa este código:
Código Delphi [-]
// 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, PosFile : Integer;
   BPF, NBR : Integer;  // BPF = Bytes Per Row, NBR = Number of Bytes Read

begin

   try

      F1 := TFileStream.Create(FileName, fmOpenRead);
      F2 := TFileStream.Create(ChangeFileExt(FileName,'.new'), fmCreate);

      BPF := Length(OldHex) div 2;

      SetLength(Buffer, BPF);

      PosFile := 0;

      while F1.Position < F1.Size do
      begin

         Application.ProcessMessages;

         NBR := F1.Read(Buffer[0], BPF);

         AuxHex := EmptyStr;

         for i := Low(Buffer) to High(Buffer) do
            AuxHex := AuxHex + IntToHex(Buffer[i],2);

         if OldHex = AuxHex then
         begin
            for i := Low(Buffer) to High(Buffer) do
               Buffer[i] := 0;
            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], NBR);
            Inc(PosFile,BPF);
         end
         else
         begin
            F2.Write(Buffer[0], 1);
            Inc(PosFile);
            F1.Seek(PosFile,soFromBeginning);
         end;

      end;

      F1.Free;
      F2.Free;
      Result := True;

   except

      F1.Free;
      F2.Free;
      Result := False;

   end;

end;
El código anterior en Delphi 7 sobre Windows 7 Professional x32, permite cambiar N ocurrencias de una cadena hexadecimal por una nueva sin importar el tamaño de la misma, esta es una modificación de la función publicada en el Msg #43.

Nota:

1- La velocidad de procesamiento es un bit menor dado que se lee el archivo por medio de una ventana deslizante determinada por la cadena de búsqueda, lo cual garantiza que se encuentren y modifiquen todas las ocurrencias de la misma.

2- La cadena de búsqueda y su sustituto (OldHex y NewHex), deben ser del mismo tamaño.

3- La función fue probada con archivos de texto y binarios (.exe y .dll), funcionado correctamente según lo esperado en todos los casos.

El archivo dump.dll original y su versión modificada dump.new en función de lo publicado en el Msg #51, esta disponible en : Test Dump

Espero sea útil :)

Nelson.

elmago00 08-01-2015 15:25:18

Muchas Gracias Nelson^\||/^\||/^\||/


La franja horaria es GMT +2. Ahora son las 22:48:32.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi