PDA

Ver la Versión Completa : Ayuda a pasar este código a firemonkey.


elmago00
06-05-2014, 19:43:42
hola,
anteriormente el señor ecfisa.
me ayudo a crear un editor hexadecimal, funciona bien en VCL. pero necesito tenerlo en firemonkey.
implementation

procedure DumpFile(aFileName:TFileName; SG: TStringGrid; const BPF: Word);
var
c, i, r: integer;
ascii: string;
aux: Byte;
begin
with TMemoryStream.Create do
try
LoadFromFile(aFileName);
// configurar StringGrid
SG.Options:= SG.Options - [goVertLine] - [goHorzLine];
SG.Font.Name:= 'Courrier';
SG.Font.Size:= 10;
SG.ColWidths[0]:= 80;
SG.Cells[0,0]:= 'Offset(h)';
SG.ColCount:= BPF+2;
SG.ColWidths[SG.ColCount-1]:= SG.Canvas.TextWidth('X') * BPF;
SG.Cells[SG.ColCount-1,0]:= 'ASCII';
for i:= 0 to BPF-1 do
begin
SG.ColWidths[i+1]:= 30;
SG.Cells[i+1,0]:= IntToHex(i,2);
end;
SG.RowCount:= Size div BPF;
// cargar en StringGrid
Seek(0, soBeginning);
c:= 0;
r:= SG.FixedRows;
while c < Size do
begin
SG.Cells[0, r]:= Format('%s',[IntToHex(c, 8)]);
ascii:= EmptyStr;
i:= 0;
while (i < BPF)and(i+c < Size) do
begin
Read(aux, SizeOf(Byte));
SG.Cells[i+1,r]:= IntToHex(aux,2);
if aux = 0 then aux := 46;
ascii:= ascii + Chr(aux);
Inc(i);
end;
SG.Cells[SG.ColCount-1,r]:= Format('%s',[ascii]);
Inc(c, BPF);
Inc(r);
end;
finally
Free;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ComboBox1.Items.CommaText:= '8,10,16,24,32,48,64,128,255';
ComboBox1.ItemIndex:= 2;
end;

procedure TForm1.btnFileClick(Sender: TObject);
begin
with OpenDialog1 do
begin
Filter:= '*.*';
if Execute then
begin
Caption:= FileName;
DumpFile(FileName, StringGrid1,
StrToInt(ComboBox1.Items[ComboBox1.ItemIndex]) );
end;
end;
end;



procedure SaveDump(aFileName:TFileName; SG: TStringGrid);
var
c,r: Integer;
s: string;
begin
with TStringList.Create do
try
for r:= SG.FixedRows to SG.RowCount-1 do
begin
s:= '';
for c:= 0 to SG.ColCount-1 do s:= s + SG.Cells[c,r] + ' ';
SetLength(s,Length(s)-1);
Add(s);
end;
SaveToFile(aFileName);
finally
Free;
end;
end;
...

procedure TForm1.btnSaveToTxtClick(Sender: TObject);
begin
with SaveDialog1 do
begin
Filter:= '*.txt';
DefaultExt:= '*.txt';
if Execute then
SaveDump(FileName, StringGrid1);
end;
end;

sera posible pasar este código a firemonkey, sin usar un Control StringGrid. es decir que se almacene en una variable, y no en StringGrid. pero sino, lo mas importante para mi es pasar este código a firemonkey. yo hago el resto.

muchas gracias por su ayuda.

nlsgarcia
06-05-2014, 20:03:01
elmago00,


...¿Sera posible pasar este código a Firemonkey, sin usar un Control StringGrid?...es decir que se almacene en una variable...


Pregunto :

1- ¿Por que no un control TStringGrid? :confused:

2- ¿Que control sugieres usar en lugar del control TStringGrid?.

3- ¿Cuando te refieres a una variable exactamente que quieres decir y por que? :confused:

4- ¿Que versión de Delphi utilizas?.

Espero sea útil :)

Nelson.

elmago00
06-05-2014, 20:09:37
gracias por responder Nelson.
veras es que lo intento hacer es abrir el archivo, y editarlo automáticamente, buscando la dirección y la cantidad de caracteres que le siguen. luego reemplazarlos por los que yo pongo. por eso decía si podía hacer lo mismo pero almacenarlo en una variable TStringGrid, sin usar el componente.

pero si no es posible. el interés mayor mio es pasarlo a firemonkey para hacer yo el resto, que es buscar la dirección mas el hexadecimal y reemplazarlo.

uso XE3.

parece algo complejo verdad? pero se resume en pasarlo a firemonkey, ya sea un componente TStringGrid o una variable. cualquiera esta bien. siempre que me permita realizar la búsqueda para hacer lo que necesito.

nlsgarcia
06-05-2014, 20:26:28
elmago00,


...lo intento hacer es abrir el archivo, y editarlo automáticamente, buscando la dirección y la cantidad de caracteres que le siguen. luego reemplazarlos por los que yo pongo. por eso decía si podía hacer lo mismo pero almacenarlo en una variable TStringGrid, sin usar el componente...


Pregunto:

1- ¿Cuando indicas buscar por dirección te refieres al Offset (Fila) y los Bytes (Columna) que se muestran en el TStringGrid del ejemplo?.

2- ¿Cuando te refieres a almacenarlo en una variable TStringGrid pero sin el componente, te refieres a poder usarlo por código pero sin la parte visual del mismo?.

Espero sea útil :)

Nelson.

elmago00
06-05-2014, 20:33:27
exacto usarlo pero sin que el usuario visualice el componente.
la búsqueda la realizo por "Offset" y reemplazo una determinada cantidad de byte(el hexadecimal) no los modifico todos solo unos cuantos, y luego guardo el archivo.

nlsgarcia
06-05-2014, 20:41:23
elmago00,


...exacto usarlo pero sin que el usuario visualice el componente...

Ok, veré que puedo hacer :rolleyes:

Pregunto: ¿Cual es la finalidad de este trabajo? :confused:

Nelson.

elmago00
06-05-2014, 20:45:10
solo poder abrir un archivo en hexadecimal, y editarlo automáticamente, para un programa que estamos desarrollando.
no es con fines comerciales, ni nada eso.

Casimiro Notevi
06-05-2014, 20:45:23
elmago00,


Ok, veré que puedo hacer :rolleyes:

Pregunto: ¿Cual es la finalidad de este trabajo? :confused:

Nelson.
Me apunto, me gustaría saberlo :)

nlsgarcia
06-05-2014, 20:57:58
elmago00,


...solo poder abrir un archivo en hexadecimal, y editarlo automáticamente...

Eso lo entiendo :rolleyes: , mi pregunta se refiere a:

1- ¿Por que este tipo de procesamiento?, ¿Sabes que pontencialmente estas construyendo un virus? :confused:

2- ¿Cuales son los detalles de la aplicación que quieres realizar?.

3- ¿Por que FireMonkey y no VCL?, ¿Es una aplicación multiplataforma?.

Espero sea útil :)

Nelson.

elmago00
07-05-2014, 03:24:58
lo siento no comprendí bien tu pregunta.
lo necesito en firemonkey, por que el software principal esta así. y no podemos mover a VCL. por que el código fuente es mas 40 mil lineas de código.

no tiene nada que ver con virus.
conoces los editores hexadecimales. bien pues eso es lo que necesito, por que el software debe editar un archivo, buscar la dirección que debe cambiar para poder cargar ese archivo.


solo necesito ese código en firemonkey. si es un componente stringGrid o no es lo de menos. solo que no querremos que el usuario haga el cambio, por que el no sabrá que esta insertando como reemplazo a la linea hexadecimal. solo eso.

hagamos una cosa. se que no crees lo que digo.
solo detallen las propiedades que tiene este código pero en firemonkey. por que el StringGrid no funciona igual que en VCL.
yo hago el resto.

gracias por responder a mis consultas.

nlsgarcia
07-05-2014, 07:56:15
elmago00,


...solo detallen las propiedades que tiene este código pero en FireMonkey...


Revisa este código:

unit Unit1;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes,
System.Variants, System.UIConsts, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs,
FMX.StdCtrls, FMX.ListBox, FMX.Layouts, FMX.Grid;

type

TColumnAccess = class(TColumn)
end;

TForm1 = class(TForm)
StringGrid1: TStringGrid;
ComboBox1: TComboBox;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.fmx}

procedure DumpFile(aFileName:TFileName; SG: TStringGrid; const BPF: Word);
var
c, i, r: Integer;
Ascii: String;
Aux: Byte;
Col, Row: Integer;
CellCtrl: TStyledControl;

begin

with TMemoryStream.Create do
try

LoadFromFile(aFileName);

// Configurar StringGrid

SG.ShowHeader := False;
SG.ShowHorzLines := False;
SG.ShowVertLines := False;

for i := 1 to BPF + 2 do
SG.AddObject(TStringColumn.Create(nil));

SG.RowCount:= Size div BPF;

for Row := 0 to SG.RowCount - 1 do
begin
for Col := 0 to SG.ColumnCount - 1 do
begin

Application.ProcessMessages;

CellCtrl := TColumnAccess(SG.Columns[Col]).CellControlByRow(Row);
if ( CellCtrl <> nil ) and (CellCtrl is TTextCell) then
begin

TTextCell(CellCtrl).StyledSettings := [];
TTextCell(CellCtrl).Font.Family := 'Courrier New';
TTextCell(CellCtrl).Font.Size := 10;
TTextCell(CellCtrl).FontColor := claBlack;
TTextCell(CellCtrl).Font.Style := [];
TTextCell(CellCtrl).TextAlign := TTextAlign.taCenter;

if (Col = 0) then
SG.Columns[Col].Width := 80;

if (Col <> SG.ColumnCount - 1) and (Col <> 0) then
SG.Columns[Col].Width := 30;

if (Col = SG.ColumnCount - 1) then
SG.Columns[Col].Width := SG.Canvas.TextWidth('X') * BPF;

end;
end;
end;

SG.Cells[0,0]:= 'Offset(h)';
SG.Cells[SG.ColumnCount-1,0]:= 'ASCII';

for i:= 0 to BPF-1 do
begin
SG.Cells:= IntToHex(i,2);
end;

// Cargar StringGrid

Seek(0, soBeginning);
c:= 0;
r:= 1;
while c < Size do
begin
SG.Cells[0, r]:= Format('%s',);
Ascii:= EmptyStr;
i:= 0;
while (i < BPF)and(i+c < Size) do
begin
Read(Aux, SizeOf(Byte));
SG.Cells[i+1,r]:= IntToHex(Aux,2);
if Aux = 0 then Aux := 46;
Ascii:= Ascii + Chr(Aux);
Inc(i);
end;
SG.Cells[SG.ColumnCount-1,r]:= Format('%s',[Ascii]);
Inc(c, BPF);
Inc(r);
end;
finally
Free;
end;
end;

// Salvar StringGrig a Archivo TXT
procedure SaveDump(aFileName:TFileName; SG: TStringGrid);
var
c,r: Integer;
s: String;
begin
with TStringList.Create do
try
for r:= 0 to SG.RowCount-1 do
begin
s:= '';
for c:= 0 to SG.ColumnCount-1 do s:= s + SG.Cells[c,r] + ' ';
SetLength(s,Length(s)-1);
Add(s);
end;
SaveToFile(aFileName);
finally
Free;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ComboBox1.Items.CommaText:= '8,10,16,24,32,48,64,128,255';
ComboBox1.ItemIndex:= 2;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
with OpenDialog1 do
begin
Filter:= '*.*';
if Execute then
begin
Caption:= FileName;
DumpFile(FileName, StringGrid1,
StrToInt(ComboBox1.Items[ComboBox1.ItemIndex]) );
end;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
with SaveDialog1 do
begin
Filter:= '*.txt';
DefaultExt:= '*.txt';
if Execute then
SaveDump(FileName, StringGrid1);
end;
end;

end.

El código anterior en Delphi XE4 bajo Windows 7 Professional x32, [I]es la implementación del código del [I]Msg #1 en FireMonkey HD, como se muestra en la siguiente imagen:

http://i42.photobucket.com/albums/e305/nlsgarcia/EditorHex-1_zps0e33c023.jpg

Espero sea útil :)

Nelson.

elmago00
07-05-2014, 09:45:00
gracias Nelson por ayudarme. ya es de madrugada y ustedes me siguen ayudando. mil gracias.

tu código solo tiene un contraste, yo como te dije antes, uso XE3.
y me da dos errores el primero dice:

TTextCell no contiene ningún miembro con el nombre StyledSettings.
es esta linea TTextCell(CellCtrl).StyledSettings := [];

veo que tu usas algunas clases que XE3 no están disponibles, como ser: FMX.StdCtrls;

el segundo problema es que abre el archivo pero en blanco, el StringGrid no muestra nada.

perdona tanta molestia, pero cuando el cerebro no da, no queda de otra, que pedir ayuda.

elmago00
07-05-2014, 10:18:13
intente no usar la opcion TTextCell(CellCtrl).StyledSettings := [];
Pero ahora me permite cerrar la venta. : )

nlsgarcia
07-05-2014, 15:36:47
elmago00,


...abre el archivo pero en blanco, el StringGrid no muestra nada...

...intente no usar la opción...TTextCell(CellCtrl).StyledSettings := []...


Pregunto:

1- ¿De que tamaño es el archivo en cuestión?.

2- ¿Puedes abrir otros archivos?.

3- ¿La eliminación de la opción mencionada es la única modificación al código propuesto en el Msg #11?.

Espero sea útil :)

Nelson.

nlsgarcia
07-05-2014, 18:39:49
elmago00,


...abre el archivo pero en blanco, el StringGrid no muestra nada...

...intente no usar la opción...TTextCell(CellCtrl).StyledSettings := []...

Es probable que el archivo probado sea muy grande (La lectura es Byte a Byte), y por ello tarda en ser visualizado, eso se soluciona con la inclusión de Application.ProcessMessages en el ciclo de carga del TStringGrid.

Revisa este código:

unit Unit1;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes,
System.Variants, System.UIConsts, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs,
FMX.StdCtrls, FMX.ListBox, FMX.Layouts, FMX.Grid;

type

TForm1 = class(TForm)
StringGrid1: TStringGrid;
ComboBox1: TComboBox;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
Button1: TButton;
Button2: TButton;
StatusBar1: TStatusBar;
Label1: TLabel;
Button3: TButton;
Button4: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure DumpFile(aFileName:TFileName; SG: TStringGrid; const BPF: Word);
procedure SaveDump(aFileName:TFileName; SG: TStringGrid);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
CancelProcess : Boolean;

implementation

{$R *.fmx}

procedure TForm1.DumpFile(aFileName:TFileName; SG: TStringGrid; const BPF: Word);
var
c, i, r, b : Integer;
Ascii: String;
Aux: Byte;
Col : Integer;

begin

with TMemoryStream.Create do
try

LoadFromFile(aFileName);

Caption:= Format('FileName = %s , FileSize = %d Bytes', [aFileName, Size]);

// Configurar StringGrid

SG.ShowHeader := False;
SG.ShowHorzLines := False;
SG.ShowVertLines := False;

for i := 1 to BPF + 2 do
SG.AddObject(TStringColumn.Create(nil));

SG.RowCount:= Size div BPF;

for Col := 0 to SG.ColumnCount - 1 do
begin

if (Col = 0) then
SG.Columns[Col].Width := 80;

if (Col <> SG.ColumnCount - 1) and (Col <> 0) then
SG.Columns[Col].Width := 30;

if (Col = SG.ColumnCount - 1) then
SG.Columns[Col].Width := SG.Canvas.TextWidth('X') * BPF;

end;

SG.Cells[0,0]:= 'Offset(h)';
SG.Cells[SG.ColumnCount-1,0]:= 'ASCII';

for i:= 0 to BPF-1 do
begin
SG.Cells:= IntToHex(i,2);
end;

// Cargar en StringGrid

Seek(0, soBeginning);
c:= 0;
r:= 1;
b := 0;

while c < Size do
begin

Application.ProcessMessages;

if CancelProcess then
begin
CancelProcess := False;
Break;
end;

SG.Cells[0, r]:= Format('%s',[IntToHex(c, 8)]);
Ascii:= EmptyStr;
i:= 0;

while (i < BPF) do
begin
Read(Aux, SizeOf(Byte));
SG.Cells[i+1,r]:= IntToHex(Aux,2);
if Aux = 0 then Aux := 46;
Ascii:= Ascii + Chr(Aux);
Inc(i);
if (b < Size) then Inc(b);
end;

SG.Cells[SG.ColumnCount-1,r]:= Format('%s',[Ascii]);
Inc(c, BPF);
Inc(r);
Label1.Text := Format('Procesado Byte %d de %d',);

end;

finally

Free;

end;

end;

// Salvar StringGrig a TXT
procedure TForm1.SaveDump(aFileName:TFileName; SG: TStringGrid);
var
c,r: Integer;
s: String;
begin
with TStringList.Create do
try
for r:= 0 to SG.RowCount-1 do
begin
s:= '';
for c:= 0 to SG.ColumnCount-1 do s:= s + SG.Cells[c,r] + ' ';
SetLength(s,Length(s)-1);
Add(s);
end;
SaveToFile(aFileName);
finally
Free;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ComboBox1.Items.CommaText:= '8,10,16,24,32,48,64,128,255';
ComboBox1.ItemIndex:= 2;
end;

// Carga un Archivo en Modo Hexadecimal en un StringGrid
procedure TForm1.Button1Click(Sender: TObject);
begin
with OpenDialog1 do
begin
Filter:= '*.*';
if Execute then
begin
DumpFile(FileName, StringGrid1,
StrToInt(ComboBox1.Items[ComboBox1.ItemIndex]) );
end;
end;
end;

// Salva un Archivo en Modo Hexadecimal en un StringGrid a TXT
procedure TForm1.Button2Click(Sender: TObject);
begin
with SaveDialog1 do
begin
Filter:= '*.txt';
DefaultExt:= '*.txt';
if Execute then
SaveDump(FileName, StringGrid1);
end;
end;

// Cancela Carga de un Archivo en Modo Hexadecimal en un StringGrid
procedure TForm1.Button3Click(Sender: TObject);
begin
CancelProcess := True;
end;

// Inicializa el StringGrid
procedure TForm1.Button4Click(Sender: TObject);
var
i : Integer;
begin
StringGrid1.RowCount := 0;
for i := StringGrid1.ColumnCount - 1 downto 0 do
StringGrid1.Columns[i].DisposeOf;
end;

end.

El código anterior en Delphi XE4 bajo Windows 7 Professional x32, es la [B]versión 2 del código propuesto en el Msg #11, con unas [I]pequeños cambios en el manejo del Visualizador de Archivos en Hexadecimal en FireMonkey, como se muestra en la siguiente imagen:

http://i42.photobucket.com/albums/e305/nlsgarcia/EditorHex-2_zps4a0aede2.jpg

El código esta disponible en : Visualizador de Archivos en Hexadecimal en FireMonkey (http://terawiki.clubdelphi.com/Delphi/Ejemplos/Varios/?download=Visualizador+de+Archivos+en+Hexadecimal.rar)

Espero sea útil :)

Nelson.

elmago00
07-05-2014, 19:35:26
muchas gracias al fin lo conseguí, se demora un poco, pero no importa. muchas gracias Nelson^\||/^\||/:)
para que fuera compatible con XE3 lo hice asi.

procedure DumpFile(aFileName:TFileName; SG: TStringGrid; const BPF: Word);
var
c, i, r, b : Integer;
Ascii: String;
Aux: Byte;
Col : Integer;

begin

with TMemoryStream.Create do
try

LoadFromFile(aFileName);



// Configurar StringGrid

SG.ShowHeader := False;
SG.ShowHorzLines := False;
SG.ShowVertLines := False;

for i := 1 to BPF + 2 do
SG.AddObject(TStringColumn.Create(nil));

SG.RowCount:= Size div BPF;

for Col := 0 to SG.ColumnCount - 1 do
begin

if (Col = 0) then
SG.Columns[Col].Width := 80;

if (Col <> SG.ColumnCount - 1) and (Col <> 0) then
SG.Columns[Col].Width := 30;

if (Col = SG.ColumnCount - 1) then
SG.Columns[Col].Width := SG.Canvas.TextWidth('X') * BPF;

end;

SG.Cells[0,0]:= 'Offset(h)';
SG.Cells[SG.ColumnCount-1,0]:= 'ASCII';

for i:= 0 to BPF-1 do
begin
SG.Cells[i+1,0]:= IntToHex(i,2);
end;

// Cargar en StringGrid

Seek(0, soBeginning);
c:= 0;
r:= 1;
b := 0;

while c < Size do
begin

Application.ProcessMessages;

if CancelProcess then
begin
CancelProcess := False;
Break;
end;

SG.Cells[0, r]:= Format('%s',[IntToHex(c, 8)]);
Ascii:= EmptyStr;
i:= 0;

while (i < BPF) do
begin
Read(Aux, SizeOf(Byte));
SG.Cells[i+1,r]:= IntToHex(Aux,2);
if Aux = 0 then Aux := 46;
Ascii:= Ascii + Chr(Aux);
Inc(i);
if (b < Size) then Inc(b);
end;

SG.Cells[SG.ColumnCount-1,r]:= Format('%s',[Ascii]);
Inc(c, BPF);
Inc(r);


end;

finally

Free;

end;

end;

// Salvar StringGrig a TXT
procedure SaveDump(aFileName:TFileName; SG: TStringGrid);
var
c,r: Integer;
s: String;
begin
with TStringList.Create do
try
for r:= 0 to SG.RowCount-1 do
begin
s:= '';
for c:= 0 to SG.ColumnCount-1 do s:= s + SG.Cells[c,r] + ' ';
SetLength(s,Length(s)-1);
Add(s);
end;
SaveToFile(aFileName);
finally
Free;
end;
end;


{guardar}

procedure TForm12.Button25Click(Sender: TObject);
begin
with SaveDialog1 do
begin
Filter:= '*.txt';
DefaultExt:= '*.txt';
if Execute then
SaveDump(FileName, StringGrid1);
end;
end;



{abrir}

procedure TForm12.Button6Click(Sender: TObject);
var
valor:string;
begin
valor:='16';
with OpenDialog1 do
begin
Filter:= '*.*';
if Execute then
begin
Caption:= FileName;
DumpFile(FileName, StringGrid1,
StrToInt(valor));
end;
end;
end;

{cancelar}

procedure TForm12.Button26Click(Sender: TObject);
begin
CancelProcess := True;
end;


gracias a Ecfisa y Nelson.^\||/

ecfisa
07-05-2014, 20:14:30
gracias por responder Nelson.
veras es que lo intento hacer es abrir el archivo, y editarlo automáticamente, buscando la dirección y la cantidad de caracteres que le siguen. luego reemplazarlos por los que yo pongo. por eso decía si podía hacer lo mismo pero almacenarlo en una variable TStringGrid, sin usar el componente.
Hola elmago00.

En el hilo anterior había interpretado que querias realizar cambios, de allí que usé un componente que te permitiera hacerlos interactivamente, pero si deseas guardarlo en un archivo de texto para trabajar sobre él, también podrías hacer:

procedure DumpFile(aFileName:TFileName; const BPF: Word);
var
c, i, r: integer;
ascii: string;
linea: string;
aux: Byte;
begin
with TMemoryStream.Create do
try
LoadFromFile(aFileName);
Seek(0, soBeginning);
with TStringList.Create do
try
c:= 0;
while c < Size do
begin
linea:= IntToHex(c, 8)+' ';
ascii:= EmptyStr;
i:= 0;
while (i < BPF) and (i+c < Size) do
begin
Read(aux, SizeOf(Byte));
linea:= linea + IntToHex(aux,2) + ' ';
if aux in [$0..$20,$80..$90] then aux:= Ord('.');
ascii:= ascii + Chr(aux);
Inc(i);
end;
linea:= linea + ascii ;
Add(linea);
Inc(c, BPF);
Inc(r);
end;
SaveToFile(ExtractFilePath(aFileName) +
ChangeFileExt(ExtractFileName(aFileName), '') + '.HEX');
finally
Free;
end;
finally
Free;
end;
end;


Uso:

DumpFile('c:\windows\notepad.exe',16);

El código te genera el archivo en la misma carpeta del archivo orígen, con el mismo nombre, de extensión .HEX y contiene los mismos datos que veías en el StringGrid.

Saludos :)

nlsgarcia
07-05-2014, 21:08:54
elmago00,


...al fin lo conseguí...

:) ^\||/

Una pequeña corrección :rolleyes: :

procedure TForm1.DumpFile(aFileName:TFileName; SG: TStringGrid; const BPF: Word);
var
c, i, r, b : Integer;
Ascii: String;
Aux: Byte;
Col : Integer;

begin

with TMemoryStream.Create do
try

LoadFromFile(aFileName);

Caption:= Format('FileName = %s , FileSize = %d Bytes', [aFileName, Size]);

// Configurar StringGrid

SG.ShowHeader := False;
SG.ShowHorzLines := False;
SG.ShowVertLines := False;

for i := 1 to BPF + 2 do
SG.AddObject(TStringColumn.Create(nil));

SG.RowCount := (Size div BPF) + 1;
if (Size Mod BPF) <> 0 then
SG.RowCount := SG.RowCount + 1;

for Col := 0 to SG.ColumnCount - 1 do
begin

if (Col = 0) then
SG.Columns[Col].Width := 80;

if (Col <> SG.ColumnCount - 1) and (Col <> 0) then
SG.Columns[Col].Width := 30;

if (Col = SG.ColumnCount - 1) then
SG.Columns[Col].Width := SG.Canvas.TextWidth('X') * BPF;

end;

SG.Cells[0,0]:= 'Offset(h)';
SG.Cells[SG.ColumnCount-1,0]:= 'ASCII';

for i:= 0 to BPF-1 do
begin
SG.Cells:= IntToHex(i,2);
end;

// Cargar en StringGrid

Seek(0, soBeginning);
c:= 0;
r:= 1;
b := 0;

while c < Size do
begin

Application.ProcessMessages;

if CancelProcess then
begin
CancelProcess := False;
Break;
end;

SG.Cells[0, r]:= Format('%s',);
Ascii:= EmptyStr;
i:= 0;

while (i < BPF) and (b < Size) do
begin
Read(Aux, SizeOf(Byte));
SG.Cells[i+1,r]:= IntToHex(Aux,2);
if Aux = 0 then Aux := 46;
Ascii:= Ascii + Chr(Aux);
Inc(i);
if (b < Size) then Inc(b);
end;

SG.Cells[SG.ColumnCount-1,r]:= Format('%s',[Ascii]);
Inc(c, BPF);
Inc(r);
Label1.Text := Format('Procesado Byte %d de %d',);

end;

finally

Free;

end;

end;

El código anterior en Delphi XE4 bajo Windows 7 Professional x32, corrige el código del [B]Msg #15 en los casos en que[I] los archivos a visualizar no sean múltiplos del factor de visualización[I] (BPF), como se muestra en la siguiente imagen:

http://i42.photobucket.com/albums/e305/nlsgarcia/EditorHex-4_zps680dc3c4.jpg

El código esta disponible en : Visualizador de Archivos en Hexadecimal v2 en FireMonkey (http://terawiki.clubdelphi.com/Delphi/Ejemplos/Varios/?download=Visualizador+de+Archivos+en+Hexadecimal+v2.rar)

Espero sea útil :)

Nelson.

elmago00
08-05-2014, 06:11:54
muchas gracias, agradezco mucho que hayan compartido su experiencia en este lenguaje conmigo. muchas gracias^\||/^\||/:D

elmago00
08-05-2014, 07:38:34
aprovecho, para preguntarles, se podrá recuperar el archivo con su extensión original.
pues al hacer el cambio en el archivo después de editarlo, no vuelve a funcionar, por que esta en hexadecimal.
¿se puede recuperar el archivo original, pero después de haberlo modificado?.

ecfisa
08-05-2014, 10:43:32
...
¿se puede recuperar el archivo original, pero después de haberlo modificado?.
Hola elmago00.

No me queda claro desde donde o a partir de qué pensas recuperar el archivo original, pero sin dudas agradecerás haber llamado a este procedimiento antes de modificar el ejecutable:

procedure BeforeDoingCrap(aFileName: TFileName);
begin
if not CopyFile(PChar(aFileName),
PChar(ExtractFilePath(aFileName)+ChangeFileExt(ExtractFileName(aFileName),'')+'.BAK'),
True) then
MessageBox(0,PChar('Error: ' + SysErrorMessage(GetLastError)), '', MB_ICONERROR);
end;

De este modo, si se estropea el ejecutable, basta con borrarlo y luego renombrar el archivo .BAK como .EXE.

Saludos :)

nlsgarcia
08-05-2014, 14:50:21
elmago00,


...se podrá recuperar el archivo con su extensión original pues al hacer el cambio en el archivo después de editarlo, no vuelve a funcionar, por que esta en hexadecimal...


Pregunto:

1- ¿Realizastes las correcciones al código indicadas en el Msg #18?, son vitales para la correcta carga y visualización del archivo en proceso.

2- ¿Que tipo de archivos estas modificando y por que lo haces de esta forma? :confused:

3- En el Msg #10 indicas que la aplicación esta hecha en FireMonkey y que tiene más de 40000 líneas de código, ¿Cual es el objetivo de esta aplicación?.

4- ¿Puedes detallar el proceso de modificación del archivo(s) en cuestión? :confused:

Espero sea útil :)

Nelson.

elmago00
08-05-2014, 20:38:19
hola,
este es el tipo de archivo. por favor descarguen el archivo para que lo vean ustedes mismos.

http://www.mediafire.com/download/xj2v47rps49roj0/inChipset.rar

quiero restaurarlo a su estado original, después de editarlo. es decir guardar cambios.

les adjunto una imagen para que ven la dirección modificar. y la verdad haber si me ayudan ya que reemplazo la cadena hexadecimal, pero la anterior no se borra,
sino que sigue delante de la otra. como si añadiera string y no reemplaza el hexadecimal, pues debo borrar los siguientes 47 caracteres. solo puedo especificar la dirección, pues el hexadecimal es diferente en todos los archivos. no puedo especificar el hexadecimal a reemplazar. solo la dirección.

es poco difícil verdad. debo entregrarlo en dos días jeje

elmago00
08-05-2014, 20:43:22
amigos alguna idea de como hacer todo esto? el tiempo se me agota jeje

Casimiro Notevi
08-05-2014, 20:43:49
elmago00,

Pregunto:

1- ¿Realizastes las correcciones al código indicadas en el Msg #18?, son vitales para la correcta carga y visualización del archivo en proceso.

2- ¿Que tipo de archivos estas modificando y por que lo haces de esta forma? :confused:

3- En el Msg #10 indicas que la aplicación esta hecha en FireMonkey y que tiene más de 40000 líneas de código, ¿Cual es el objetivo de esta aplicación?.

4- ¿Puedes detallar el proceso de modificación del archivo(s) en cuestión? :confused:

Espero sea útil :)

Nelson.

Esperando respuestas...

elmago00
08-05-2014, 21:02:49
Esperando respuestas...

si hice las correcciones, eso ya esta solucionado, veo el archivo y lo guardo, esta solucionado.
el tipo de archivo se los pues en el link de descarga.
el objetivo ya lo e detallado en el anterior mensaje. asi como el proceso de edición del mismo.


saludos

ecfisa
08-05-2014, 21:08:24
amigos alguna idea de como hacer todo esto? el tiempo se me agota jeje
Hola elmago00.

Sigo sin entender desde donde queres restaurar el archivo original, pero ya te sugerí una idea. Te ejemplifico el uso:

...
procedure BeforeDoingCrap(const aFileName: TFileName);
begin
CopyFile(PChar(aFileName),
PChar(ExtractFilePath(aFileName)+ChangeFileExt(ExtractFileName(aFileName),'')+'.BAK'),
True);
end;

procedure FixCrap(const aFileName: TFileName);
begin
if MessageBox(0,'¿ Desea restaurar el archivo original ?','',MB_ICONQUESTION+MB_YESNO)=IDYES then
begin
Windows.DeleteFile(PChar(aFileName));
if not MoveFile(PChar(ExtractFilePath(aFileName)+ChangeFileExt(ExtractFileName(aFileName),'')+'.BAK'),
PChar(aFileName)) then
MessageBox(0,PChar('Error: ' + SysErrorMessage(GetLastError)), '', MB_ICONERROR);
end;
end;

procedure TForm1.btnLoadFileClick(Sender: TObject);
begin
BeforeDoingCrap('C:\Carpeta\notepad.exe');
// En este punto tenes realizado el resguardo y podes hacer
// con el archivo original todas las aberraciones se se te ocurran :)
procedure DumpFile('C:\Carpeta\notepad.exe',16);
end;


// Boton anti-pánico
procedure TForm1.btnFixClick(Sender: TObject);
begin
FixCrap('C:\Carpeta\notepad.exe'); // Restaurar original desde copia
end;


Saludos :)

elmago00
08-05-2014, 21:11:47
quiero editar el archivo en hexadecimal y guardarlo todo. guardar todo el archivo hexadecimal pero ya modificado y en su extensión original.
para que funciono como antes con la modificacion hecha.

ecfisa
08-05-2014, 21:47:38
Hola elmago00.
quiero editar el archivo en hexadecimal y guardarlo todo. guardar todo el archivo hexadecimal pero ya modificado y en su extensión original.
para que funciono como antes con la modificacion hecha.
Ahora si te entiendo.

Pero es claro que, el que funcione o no, dependerá de los cambios que realizes. Basta una sóla modificación indebida sobre una dirección de memoria, puntero, segmento, offset, etc, como para hacer que la aplicación se cuelgue o peor aún... haga alguna cosa no deseada.

Saludos :)

nlsgarcia
08-05-2014, 22:28:46
elmago00,


...el tiempo se me agota... :confused:


Te comento:

1- No has respondido en detalle las preguntas 2, 3 y 4 formuladas en el Msg #22.

2- No especificas ningún detalle de la funcionalidad del archivo inChipset.bin del Msg #23, ¿Que es ese archivo?, ¿Cual es su origen?, ¿Cual es su uso?, ¿Que es lo que quieres modificar y por que?.

Suerte en tu proyecto :cool:

Nelson.

elmago00
09-05-2014, 07:07:39
el objetivo es modificar la función de este IC, por que funciona bien, y para eso debemos hacer lo antes descrito.
esto solo de puede hacer en ensamblador y hexadecimal. nosotros lo hacemos en hexadecimal.
http://upload.wikimedia.org/wikipedia/commons/8/80/Three_IC_circuit_chips.JPG

y para colmo a la hora de modificar el archivo hexadecimal, no puedo eliminar la cadena anterior por que es diferente en todos los archivos, lo unico que se me ocurre es eliminar un conteo de los siguientes caracteres, pero hasta ahora no veo como.

http://sia1.subirimagenes.net/img/2014/05/09/140509073121935676.png
después de hacer esto debo restaurarlo a su extensión original

ahora si conteste a sus preguntas?

se que es complicado, tienen alguna idea.

elmago00
09-05-2014, 07:39:20
ahora si conteste a sus preguntas?

se que es complicado, tienen alguna idea.


intente realizar un conteo de caracteres siguientes para eliminarlo pero nada funciona.
y menos el recuperar el archivo despues de editarlo.
http://sia1.subirimagenes.net/img/2014/05/09/140509073910321341.png

ecfisa
09-05-2014, 16:23:37
Hola elmago00.
quiero editar el archivo en hexadecimal y guardarlo todo. guardar todo el archivo hexadecimal pero ya modificado y en su extensión original.
para que funciono como antes con la modificacion hecha.
Hola elmago00.

Este código permite abrir, modificar, buscar texto obre la columna ASCII y guardar el archivo modificado con el mismo nombre u otro.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, XPMan, Menus, ComCtrls, ExtCtrls;

type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
FindDialog1: TFindDialog;
Archivo1: TMenuItem;
miOpen: TMenuItem;
miSave: TMenuItem;
Buscartexto1: TMenuItem;
Panel1: TPanel;
Label1: TLabel;
ComboBox1: TComboBox;
StringGrid1: TStringGrid;
procedure FormCreate(Sender: TObject);
procedure miOpenClick(Sender: TObject);
procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure Buscartexto1Click(Sender: TObject);
procedure FindDialog1Find(Sender: TObject);
procedure miSaveClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FStream: TMemoryStream;
FColAsc: TStrings;
FFind: Integer;
procedure DumpFile(aFileName:TFileName; const BPF: Word);
procedure SaveDump(aFileName:TFileName; const BPF: Word);
public
end;

var
Form1: TForm1;

implementation {$R *.dfm}

{ Public declarations }
procedure TForm1.FormCreate(Sender: TObject);
begin
ComboBox1.Items.CommaText:= '8,10,16,24,32,48,64,128,255';
ComboBox1.ItemIndex:= 2;
FStream:= TMemoryStream.Create;
FColAsc:= TStringList.Create;
with StringGrid1 do
begin
Options:= Options-[goVertLine]-[goHorzLine]+[goEditing];
Font.Name:= 'Courier';
Font.Size:= 10;
Col:= 1;
Row:= 1;
end;
end;

procedure TForm1.miOpenClick(Sender: TObject);
begin
with OpenDialog1 do
begin
Filter:= '*.*';
if Execute then
begin
Caption:= FileName;
DumpFile(FileName, StrToInt(ComboBox1.Items[ComboBox1.ItemIndex]) );
end;
end;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
with TStringGrid(Sender) do
CanSelect:= ((ACol>0)and(ACol < ColCount-1) and
((ARow>= FixedRows)and(ARow < RowCount)));
end;

procedure TForm1.miSaveClick(Sender: TObject);
begin
with SaveDialog1 do
begin
Filter:= '*.*';
if Execute then SaveDump(FileName, 16);
end;
end;

procedure TForm1.Buscartexto1Click(Sender: TObject);
begin
with FindDialog1 do
begin
FFind:= 0;
Execute;
end;
end;

procedure TForm1.FindDialog1Find(Sender: TObject);
begin
while(FFind < FColAsc.Count)and(Pos(FindDialog1.FindText,FColAsc[FFind])=0) do
Inc(FFind);
if (FFind < FColAsc.Count-1) then
begin
Inc(FFind);
StringGrid1.Row:= FFind;
StringGrid1.Col:= 1;
end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FStream.Free;
FColAsc.Free;
end;


{ Private declarations }
procedure TForm1.DumpFile(aFileName:TFileName; const BPF: Word);
var
c, i, r: integer;
ascii: string;
aux: Byte;
begin
FStream.LoadFromFile(aFileName);
with StringGrid1 do
begin
ColWidths[0]:= 80;
Cells[0,0]:= 'Offset (h)';
ColCount:= BPF+2;
ColWidths[ColCount-1]:= Canvas.TextWidth('X')*BPF+10;
Cells[ColCount-1,0]:= 'ASCII';
for i:= 0 to BPF-1 do
begin
ColWidths[i+1]:= 30;
Cells[i+1,0]:= IntToHex(i, 2);
end;
RowCount:= FStream.Size div BPF+1;

FStream.Seek(0, soBeginning);
c:= 0;
r:= FixedRows;
while c < FStream.Size do
begin
Cells[0, r]:= Format('%s',[IntToHex(c, 8)]);
ascii:= EmptyStr;
i:= 0;
while (i < BPF) and(i+c < FStream.Size) do
begin
FStream.Read(aux, SizeOf(Byte));
Cells[i+1,r]:= IntToHex(aux,2);
if aux in [$0..$0D,$80..$90] then aux:= Ord('.');
ascii:= ascii + Chr(aux);
Inc(i);
end;
FColAsc.Add(ascii);
Cells[ColCount-1,r]:= ascii;
Inc(c, BPF);
Inc(r);
end;
end;
end;

procedure TForm1.SaveDump(aFileName:TFileName; const BPF: Word);
var
MS: TMemoryStream;
c,r: Integer;
buff: array of Byte;
begin
with StringGrid1 do
begin
MS:= TMemoryStream.Create;
try
SetLength(buff, BPF);
for r:= FixedRows to RowCount-1 do
begin
for c:= 0 to BPF-1 do buff[c]:= StrToInt('$'+Cells[c+1, r]);
MS.WriteBuffer(buff[0], BPF);
end;
MS.SaveToFile(aFileName);
finally
SetLength(buff,0);
MS.Free;
end;
end;
end;
end.

Lamento no haberlo escrito para FireMonkey pero solo cuento con Delphi 7. Con seguridad lo podrás adaptar del modo como comentaste en el mensaje #19.

En todas las pruebas que realizé, modificando constantes de texto, el ejecutable resultante funcionó de modo correcto mostrando los valores modificados.

Descarga desde FTP Club Delphi: EditorHexadecimalBásico (http://terawiki.clubdelphi.com/Delphi/Ejemplos/Carpetas_BD_Archivos/?download=EditorHexadecimalB%E1sico.zip)

Saludos :)

nlsgarcia
09-05-2014, 17:49:42
elmago00,


...Lamento no haberlo escrito para FireMonkey pero solo cuento con Delphi 7...

^\||/


...¿Ahora si conteste a sus preguntas?...

:rolleyes:

Te comento: No puedes salvar la representación Hexadecimal del archivo cargado en el TStringGrid y que este tenga los atributos y comportamiento del original, debes salvar el archivo y sus modificaciones en Binario.

Revisa este código:

unit Unit1;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes,
System.Variants, System.UIConsts, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs,
FMX.StdCtrls, FMX.ListBox, FMX.Layouts, FMX.Grid;

type

TForm1 = class(TForm)
StringGrid1: TStringGrid;
ComboBox1: TComboBox;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
Button1: TButton;
Button2: TButton;
StatusBar1: TStatusBar;
Label1: TLabel;
Button3: TButton;
Button4: TButton;
Button5: TButton;
SaveDialog2: TSaveDialog;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure DumpFile(aFileName:TFileName; SG: TStringGrid; const BPF: Word);
procedure SaveDumpText(aFileName:TFileName; SG: TStringGrid);
procedure SaveDumpBinary(aFileName:TFileName; const BPF: Word);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
CancelProcess : Boolean;

implementation

{$R *.fmx}

procedure TForm1.DumpFile(aFileName:TFileName; SG: TStringGrid; const BPF: Word);
var
c, i, r, b : Integer;
Ascii: String;
Aux: Byte;
Col : Integer;

begin

with TMemoryStream.Create do
try

LoadFromFile(aFileName);

Caption:= Format('FileName = %s , FileSize = %d Bytes', [aFileName, Size]);

// Configurar StringGrid

SG.ShowHeader := False;
SG.ShowHorzLines := False;
SG.ShowVertLines := False;

for i := 1 to BPF + 2 do
SG.AddObject(TStringColumn.Create(nil));

SG.RowCount := (Size div BPF) + 1;
if (Size Mod BPF) <> 0 then
SG.RowCount := SG.RowCount + 1;

for Col := 0 to SG.ColumnCount - 1 do
begin

if (Col = 0) then
SG.Columns[Col].Width := 80;

if (Col <> SG.ColumnCount - 1) and (Col <> 0) then
SG.Columns[Col].Width := 30;

if (Col = SG.ColumnCount - 1) then
SG.Columns[Col].Width := SG.Canvas.TextWidth('X') * BPF;

end;

SG.Cells[0,0]:= 'Offset(h)';
SG.Cells[SG.ColumnCount-1,0]:= 'ASCII';

for i:= 0 to BPF-1 do
begin
SG.Cells:= IntToHex(i,2);
end;

// Cargar en StringGrid

Seek(0, soBeginning);
c:= 0;
r:= 1;
b := 0;

while c < Size do
begin

Application.ProcessMessages;

if CancelProcess then
begin
CancelProcess := False;
Break;
end;

SG.Cells[0, r]:= Format('%s',);
Ascii:= EmptyStr;
i:= 0;

while (i < BPF) and (b < Size) do
begin
Read(Aux, SizeOf(Byte));
SG.Cells:= IntToHex(Aux,2);
if Aux = 0 then Aux := 46;
Ascii:= Ascii + Chr(Aux);
Inc(i);
if (b < Size) then Inc(b);
end;

SG.Cells[SG.ColumnCount-1,r]:= Format('%s',[Ascii]);
Inc(c, BPF);
Inc(r);
Label1.Text := Format('Procesado Byte %d de %d',);

end;

finally

Free;

end;

end;

// Salvar StringGrig a TXT
procedure TForm1.SaveDumpText(aFileName:TFileName; SG: TStringGrid);
var
c,r: Integer;
s: String;
begin
with TStringList.Create do
try
for r:= 0 to SG.RowCount-1 do
begin
s:= '';
for c:= 0 to SG.ColumnCount-1 do s:= s + SG.Cells[c,r] + ' ';
SetLength(s,Length(s)-1);
Add(s);
end;
SaveToFile(aFileName);
finally
Free;
end;
end;

// Salvar StringGrig a Binario
procedure TForm1.SaveDumpBinary(aFileName:TFileName; const BPF: Word);
var
MS: TMemoryStream;
c,r: Integer;
buff: array of Byte;
begin
with StringGrid1 do
begin
MS:= TMemoryStream.Create;
try
SetLength(buff, BPF);
for r:= 1 to RowCount-1 do
begin
for c:= 0 to BPF-1 do buff[c]:= StrToInt('$'+Cells[c+1, r]);
MS.WriteBuffer(buff[0], BPF);
end;
MS.SaveToFile(aFileName);
finally
SetLength(buff,0);
MS.Free;
end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ComboBox1.Items.CommaText:= '8,10,16,24,32,48,64,128,255';
ComboBox1.ItemIndex:= 2;
end;

// Carga un Archivo en Modo Hexadecimal en un StringGrid
procedure TForm1.Button1Click(Sender: TObject);
begin
with OpenDialog1 do
begin
Filter:= '*.*';
if Execute then
begin
DumpFile(FileName, StringGrid1,
StrToInt(ComboBox1.Items[ComboBox1.ItemIndex]) );
end;
end;
end;

// Salva un Archivo en Modo Hexadecimal en un StringGrid a TXT
procedure TForm1.Button2Click(Sender: TObject);
begin
with SaveDialog1 do
begin
Filter:= '*.txt';
DefaultExt:= '*.txt';
if Execute then
SaveDumpText(FileName, StringGrid1);
end;
end;

// Cancela Carga de un Archivo en Modo Hexadecimal en un StringGrid
procedure TForm1.Button3Click(Sender: TObject);
begin
CancelProcess := True;
end;

// Inicializa el StringGrid
procedure TForm1.Button4Click(Sender: TObject);
var
i : Integer;
begin
StringGrid1.RowCount := 0;
for i := StringGrid1.ColumnCount - 1 downto 0 do
StringGrid1.Columns[i].DisposeOf;
end;

// Salva un Archivo en Modo Hexadecimal en un StringGrid a Binario
procedure TForm1.Button5Click(Sender: TObject);
begin
with SaveDialog1 do
begin
Filter:= '*.*';
if Execute then SaveDumpBinary(FileName, 16);
end;
end;

end.

El código anterior en Delphi XE4 bajo Windows 7 Professional x32, es la versión 3 del código propuesto en el Msg #15 con las correcciones incluidas del Msg #18, el cual te permitirá: [I]Cargar, [B][I]Representar y [I]Editar archivos visualmente en Hexadecimal y salvarlos posteriormente en su representación Hexadecimal (Modo Texto) o Binaria, como se muestra en la siguiente imagen:

http://i42.photobucket.com/albums/e305/nlsgarcia/EditorHex-5_zps8de55d9b.jpg

El código esta disponible en : Visualizador de Archivos en Hexadecimal en FireMonkey v3 (http://terawiki.clubdelphi.com/Delphi/Ejemplos/Varios/?download=Visualizador+de+Archivos+en+Hexadecimal+v3.rar)

Suerte en tu proyecto :cool:

Nelson.

nlsgarcia
09-05-2014, 22:00:24
elmago00,

Continuación del Msg #34

Una pequeña corrección :rolleyes: :

// Salvar StringGrig a Binario
procedure TForm1.SaveDumpBinary(aFileName:TFileName; const BPF: Word);
var
MS: TMemoryStream;
c,r: Integer;
Buffer: Byte;
Msg : String;
begin
with StringGrid1 do
begin
MS:= TMemoryStream.Create;
try
for r:= 1 to RowCount-1 do
begin
for c:= 0 to BPF-1 do
begin
if (Cells[c+1, r] <> '') then
begin
Buffer := StrToInt('$'+Cells[c+1, r]);
MS.WriteBuffer(Buffer, 1);
end;
end;
end;
MS.SaveToFile(aFileName);
finally
MS.Free;
Msg := 'Generación de Archivo Binario Completada Satisfactoriamente';
MessageDlg(Msg,TMsgDlgType.mtInformation,[TMsgDlgBtn.mbOk],0);
end;
end;
end;


// Salva un Archivo en Modo Hexadecimal en un StringGrid a Binario
procedure TForm1.Button5Click(Sender: TObject);
var
BPF : Integer;
begin
with SaveDialog1 do
begin
Filter:= '*.*';
BPF := StrToInt(ComboBox1.Items.Strings[ComboBox1.ItemIndex]);
if Execute then SaveDumpBinary(FileName, BPF);
end;
end;

El código anterior en Delphi XE4 bajo Windows 7 Professional x32, corrige el código del Msg #34 en los casos en que los archivos a visualizar no sean múltiplos del factor de visualización (BPF), como se muestra en la siguiente imagen:

http://i42.photobucket.com/albums/e305/nlsgarcia/EditorHex-4_zps680dc3c4.jpg

Suerte en tu proyecto :cool:

Nelson.

elmago00
10-05-2014, 20:13:30
llevo horas tratando, pero creo que mejor haré los cambios, y lo guardare en SaveToStream.
para que guarde los cambios en el archivo original. después de editarlo en memoria.
seguiré tratando y luego les cuento como fue.

nlsgarcia
10-05-2014, 20:23:34
elmago00,


...llevo horas tratando, pero creo que mejor haré los cambios, y lo guardare en SaveToStream para que guarde los cambios en el archivo original después de editarlo en memoria... :confused:
Pregunto: ¿Probastes el código del Msg #34 y la corrección del Msg#35?.

Nelson.

ecfisa
10-05-2014, 22:11:07
Hola elmago00.

¿ Es imprescindible que uses FireMonkey ? Por que el código del mensaje #33 esta probado, hace lo que buscas y funciona correctamente. También pude apreciar que no son tan radicales las modificaciones echas al código que parten de este enlce Codigo Hexadecimal (http://www.clubdelphi.com/foros/showpost.php?p=476026&postcount=14) para adecuarlas a FireMonkey.

Por otro lado, si deseas usa un editor hexadecimal mas poderoso, te vuelvo a sugerir lo que te mencioné en el otro hilo: HxD (http://mh-nexus.de/en/hxd/) es totalmente gratuito.

Saludos :)

elmago00
11-05-2014, 01:14:21
elmago00,


Pregunto: ¿Probastes el código del Msg #34 y la corrección del Msg#35?.

Nelson.


Porsupuesto Nelson y dejame decirte que funciona perfecto. pero bajo un control TSringGrid.
y estoy usando el código de efisa del msg#17 este código me permite almacenarlo en variable y editarlo desde un archivo y sin usar el Control visible.
lo que hago en estos momentos es pasar tu código para que al igual al de ecfisa editarlo en un archivo guardado. y luego pasarlo a binario, tal y como lo tienes tu que funciona, pero que no eso ese método por que se demora, 15 minutos en cargar un archivo de 9mb.
// Salvar StringGrig a Binario
procedure TForm1.SaveDumpBinary(aFileName:TFileName; const BPF: Word);
var
MS: TMemoryStream;
c,r: Integer;
Buffer: Byte;
Msg : String;
begin
with StringGrid1 do
begin
MS:= TMemoryStream.Create;
try
for r:= 1 to RowCount-1 do
begin
for c:= 0 to BPF-1 do
begin
if (Cells[c+1, r] <> '') then
begin
Buffer := StrToInt('$'+Cells[c+1, r]);
MS.WriteBuffer(Buffer, 1);
end;
end;
end;
MS.SaveToFile(aFileName);
finally
MS.Free;
Msg := 'Generación de Archivo Binario Completada Satisfactoriamente';
MessageDlg(Msg,TMsgDlgType.mtInformation,[TMsgDlgBtn.mbOk],0);
end;
end;
end;

este es tu código que trato de usar sin el control.

dirás por que este se complica tanto. por la idea es modificar el archivo sin visualizarlo. así la corrección en el IC se hace mas rápido, y el procesador (que no es muy poderoso) lo ejecuta rápido.

elmago00
11-05-2014, 01:22:16
Hola elmago00.

¿ Es imprescindible que uses FireMonkey ? Por que el código del mensaje #33 esta probado, hace lo que buscas y funciona correctamente. También pude apreciar que no son tan radicales las modificaciones echas al código que parten de este enlce Codigo Hexadecimal (http://www.clubdelphi.com/foros/showpost.php?p=476026&postcount=14) para adecuarlas a FireMonkey.

Por otro lado, si deseas usa un editor hexadecimal mas poderoso, te vuelvo a sugerir lo que te mencioné en el otro hilo: HxD (http://mh-nexus.de/en/hxd/) es totalmente gratuito.

Saludos :)

todo el software tiene 15 unit, 6 dll. y 83 procesos y 57 funciones.
los procesos son muy grandes, el mínimo tiene 1200 lineas.

una unit tiene 11.453 lineas. las otras son de 2000. todo esto es bajo firemonkey, pasarlo a vcl es imposible en tan poco tiempo.
y la idea es que todo este en el mismo programa, pues el gerente informático de la otra empresa así lo solicito.(no se por que)


aun con VCL, tu me has ayudado enormemente y que decir de Nelson, tiene un cerebro para firemonkey, que me pregunto ¿son humanos?:):)

nlsgarcia
11-05-2014, 05:08:44
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:

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,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, [I]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,


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

Falta una pequeña corrección :rolleyes:

Revisa este código:

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,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;

// [I]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,


...¿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,


...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,


...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
lo hago asi

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:
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,


...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,


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

:rolleyes:

Revisa este código:

// 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,2);

if OldHex = AuxHex then
begin
for i := Low(Buffer) to High(Buffer) do
Buffer := 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, [I]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, [I]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 (https://app.box.com/s/d4wgdzlea2i5y7iz2wks)

Espero sea útil :)

Nelson.

elmago00
08-01-2015, 15:25:18
Muchas Gracias Nelson^\||/^\||/^\||/