Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-04-2011
broly7 broly7 is offline
Miembro
 
Registrado: jun 2008
Posts: 43
Poder: 0
broly7 Va por buen camino
Buscar y reemplazar Bytes.

HOla! Buscando con un editor hexadecimal en un archivo encuentro una cadena de bytes (00 05 FC...por ejemplo).
Entonces no sé cómo hacer en Delphi para que me encuentre esa cadena y reemplazarla por otra. Creo explicarme bien, Gracias.
Responder Con Cita
  #2  
Antiguo 12-04-2011
Avatar de Red_Leon
Red_Leon Red_Leon is offline
Miembro
 
Registrado: oct 2007
Ubicación: Castilla la Mancha
Posts: 27
Poder: 0
Red_Leon Va por buen camino
Con esto podras encontrar la posición de la cadena:

Código Delphi [-]
Pos(Chr($00)+Chr($05)+Chr($FC)...,Cadena);

Ya puedes jugar con replace, copy ... como más te guste.

Ahora ten encuenta que debes de tener el fichero como un String.

Tal vez sería más recomendable coger el fichero como un Stream y ir mirando los bytes y reemplazar o crear otro fichero con los valores que desees.

Un Saludo!

Espero haberte ayudado.
Responder Con Cita
  #3  
Antiguo 12-04-2011
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Mira esto.

Saludos.
Responder Con Cita
  #4  
Antiguo 12-04-2011
broly7 broly7 is offline
Miembro
 
Registrado: jun 2008
Posts: 43
Poder: 0
broly7 Va por buen camino
Cita:
Empezado por escafandra Ver Mensaje
Mira esto.

Saludos.
No tengo ni idea de programar en C jajaja.
De todas formas he encontrado algo parecido que trabaj de forma parecida a la mía pero no consigo que encuentre una cadena de mas de 1 Byte.

Código Delphi [-]
 var
fs: TFileStream;
Buff: Array [0..10239] of Byte; // a 10Kb Array
b: Byte;
FP, MP: Integer; // FilePos and MemoryPos
i: Integer;
ReadBytes: Integer;
begin

fs := TFileStream.Create(Extractfilepath(application.exename)+'prueba.dat', fmOpenReadWrite);

FP := 0;
b := Ord($FF);
while fs.Position < fs.Size do
begin
ReadBytes := fs.Read(Buff, SizeOf(Buff));
// scan the buffer for #FF bytes
for i := 0 to ReadBytes - 1 do
begin
if (Buff[i] = ($AA)) then
begin
// Set the file pointer to the right place
fs.Seek(FP + i, soFromBeginning);
fs.Write(b, 1);
end;
end;
end;
FP := FP + SizeOf(Buff);
// set the file pointer to the start of the next block
fs.Seek(FP, soFromBeginning);
Fs.Free;
end;

Esto cambia todos los hexabytes AA por FF. Pero para una cadena como $AABBCCDD no sé cómo hacerlo =/
Responder Con Cita
  #5  
Antiguo 12-04-2011
Avatar de Red_Leon
Red_Leon Red_Leon is offline
Miembro
 
Registrado: oct 2007
Ubicación: Castilla la Mancha
Posts: 27
Poder: 0
Red_Leon Va por buen camino
Deberias comprobar como minimo que

Código Delphi [-]

if (i + 4 and ((Buff[i] = ($AA)) and ((Buff[i+1] = ($BB)) and ((Buff[i] = ($CC)) then
begin
...
end;

Es lo que te decia anteriormente coger el archivo como un Stream.
Responder Con Cita
  #6  
Antiguo 13-04-2011
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por broly7 Ver Mensaje
No tengo ni idea de programar en C jajaja.
Código:
procedure Replace(Buffer, Val, newVal: PBYTE; SizeBuffer, SizeVal: cardinal);
var
  n, i: cardinal;
begin
   for n:= 0 to SizeBuffer-1 do
   begin
      if PBYTE((cardinal(Buffer) + n))^ = Val^ then
      begin
         for i:= 1 to SizeVal-1 do
           if PBYTE(cardinal(Buffer)+n+i)^ <> PBYTE(cardinal(Val)+i)^ then  break;
         if i=sizeVal then
           CopyMemory(PBYTE(cardinal(Buffer)+n), newVal, SizeVal);
      end;
   end;
end;
Saludos.
Responder Con Cita
  #7  
Antiguo 13-04-2011
broly7 broly7 is offline
Miembro
 
Registrado: jun 2008
Posts: 43
Poder: 0
broly7 Va por buen camino
SOlucionado. Esta web es sencillamente increible, justo lo que buscaba y muy bien explicado:http://www.underground.mn/showthread.php?t=203322

Saludos.
Responder Con Cita
  #8  
Antiguo 14-04-2011
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Vista la necesidad, publico la traducción del código publicado aquí.
Código Delphi [-]
procedure Replace(Buffer, Val, newVal: PBYTE; SizeBuffer, SizeVal: cardinal);
var
  n, i: cardinal;
begin
   for n:= 0 to SizeBuffer-1 do
   begin
      if PBYTE((cardinal(Buffer) + n))^ = Val^ then
      begin
         for i:= 1 to SizeVal-1 do
           if PBYTE(cardinal(Buffer)+n+i)^ <> PBYTE(cardinal(Val)+i)^ then  break;
         if i=sizeVal then
           CopyMemory(PBYTE(cardinal(Buffer)+n), newVal, SizeVal);
      end;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  MS: TMemoryStream;
begin
   MS:= TMemoryStream.Create;

   MS.LoadFromFile('project1.exe');
   Replace(MS.Memory, PBYTE(PCHAR('hola')), PBYTE(PCHAR('casa')), MS.Size, 4);
   MS.SaveToFile('prueba.exe');

   MS.destroy;

end;


Saludos.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Buscar y reemplazar en el registro aom Varios 2 21-09-2006 13:50:06
Buscar y/o reemplazar una celda en Excel... fcios Servers 2 14-12-2005 16:33:27
Buscar y Reemplazar Xianto Varios 3 24-01-2005 20:29:43
Buscar y Reemplazar en un ADOTable rjsitruiz Conexión con bases de datos 1 01-06-2004 22:52:27
Buscar y reemplazar sur-se Servers 2 16-04-2004 18:36:16


La franja horaria es GMT +2. Ahora son las 22:50:58.


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
Copyright 1996-2007 Club Delphi