Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-10-2014
Avatar de ZayDun
ZayDun ZayDun is offline
Miembro
 
Registrado: Mar 2007
Posts: 128
Poder: 11
ZayDun Va por buen camino
Buscar cadena en un archivo binario

Hola, llevo un buen rato buscando información tanto en el foro como en google sobre editar archivos binarios y no encuentro la solución a lo que busco, os cuento por si me podéis ayudar.

tengo un archivo llamado "config.dat", lo he abierto con un editor de texto y aparecen caracteres codificados y entre ellos se encuentra la cadena que estoy buscando sin codificar, en principio mi idea era la de abrir, buscar, reemplazar y guardar, pero se me esta complicando el código para hacerlo, buscando por el foro encontré este código..

Código Delphi [-]
procedure TFPrincipal.AnadirStreamBinario;
var F: TFileStream;
    Buffer: array[0..1023] of byte;
    i, j: Integer;
    b: Byte;
begin
  F := TFileStream.Create( ExtractFilePath( Application.ExeName ) + 'prueba.dat', fmOpenWrite );
  F.Position := F.Size;

  b := 0;
  // Guardamos 100 veces el buffer de 1 KB (100 KB)
  for j := 1 to 100 do
  begin
    for i := 0 to 1023 do
    begin
      Buffer[i] := b;
      Inc( b );
    end;

    F.Write( Buffer, 1024 );
  end;

  F.Free;
end;

Pero ahora no se como hacer para buscar dentro del archivo la cadena que estoy buscando.
Responder Con Cita
  #2  
Antiguo 10-10-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: Feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 14
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
ZayDun,

Cita:
Empezado por ZayDun
...Buscar cadena en un archivo binario...abrir, buscar, reemplazar y guardar...


Revisa esta información:
Te sugiero revisar específicamente el Msg #43.

Espero sea útil

Nelson.
Responder Con Cita
  #3  
Antiguo 10-10-2014
Avatar de ZayDun
ZayDun ZayDun is offline
Miembro
 
Registrado: Mar 2007
Posts: 128
Poder: 11
ZayDun Va por buen camino
Cita:
Empezado por nlsgarcia Ver Mensaje
ZayDun,




Revisa esta información:
Te sugiero revisar específicamente el Msg #43.

Espero sea útil

Nelson.
Muchas gracias Nelson! llevaba toda la mañana buscando y haciendo pruebas, te agradezco mucho tu ayuda.
Responder Con Cita
  #4  
Antiguo 10-10-2014
Avatar de ZayDun
ZayDun ZayDun is offline
Miembro
 
Registrado: Mar 2007
Posts: 128
Poder: 11
ZayDun Va por buen camino
Cita:
Empezado por nlsgarcia Ver Mensaje
ZayDun,




Revisa esta información:
Te sugiero revisar específicamente el Msg #43.

Espero sea útil

Nelson.

He copiado el código que me has facilitado tal y como esta y me copila sin problemas, ya he reemplazado la ruta y las cadenas hex y me lanza el mensaje "Cambio de Archivo Realizado" y me genera una copia exacta con la extensión *.new del archivo pero no modificada nada, he probado con diferentes rutas incluso con un archivo de texto plano, alguna idea de que puede ser?

Estoy utilizando Windows 7 64bit y la versión Delphi XE5.

Última edición por ZayDun fecha: 10-10-2014 a las 18:09:44.
Responder Con Cita
  #5  
Antiguo 10-10-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: Feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 14
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
ZayDun,

Cita:
Empezado por ZayDun
...He copiado el código...pero no modificada nada...¿alguna idea de que puede ser?...


Te comento:

1- El código del Msg #43 del link sugerido, tiene dos funciones para el cambio de archivos a nivel Binario : ChangeFileHex y ChangeFileOffset las cuales, permiten cambiar una cadena hexadecimal en un archivo.

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

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

Pregunto:

1- ¿Cual función utilizastes ChangeFileHex o ChangeFileOffset?.

2- ¿Has utilizado el programa HxD - Hexeditor para ubicar el offset de la cadena a modificar?.

Revisa con detalle todo lo anterior, si aun no te funciona, publica un link para descargar el archivo con el detalle de lo que quieres modificar y vere que puedo hacer


Espero sea útil


Nelson.
Responder Con Cita
  #6  
Antiguo 10-10-2014
Avatar de ZayDun
ZayDun ZayDun is offline
Miembro
 
Registrado: Mar 2007
Posts: 128
Poder: 11
ZayDun Va por buen camino
Cita:
Empezado por nlsgarcia Ver Mensaje
ZayDun,




Te comento:

1- El código del Msg #43 del link sugerido, tiene dos funciones para el cambio de archivos a nivel Binario : ChangeFileHex y ChangeFileOffset las cuales, permiten cambiar una cadena hexadecimal en un archivo.

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

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

Pregunto:

1- ¿Cual función utilizastes ChangeFileHex o ChangeFileOffset?.

2- ¿Has utilizado el programa HxD - Hexeditor para ubicar el offset de la cadena a modificar?.

Revisa con detalle todo lo anterior, si aun no te funciona, publica un link para descargar el archivo con el detalle de lo que quieres modificar y vere que puedo hacer


Espero sea útil


Nelson.
El problema como casi siempre.. era mio, parece que se ha solucionado el problema dandole permisos de administrador, como te decía el código copilaba perfectamente pero no realizaba el cambio.

Tengo una última duda si fueses tan amable de contestarme, estoy utilizando la función ChangeFileHex y a veces el nombre de la cadena es mas largo que el de la original, hay alguna posibilidad de permitir que cambie independientemente del tamaño de la cadena? cuando realizo el cambio manualmente en el archivo no hay ningún problema con el archivo, es decir que no se vuelve corrupto. Gracias de nuevo por tu tiempo.
Responder Con Cita
  #7  
Antiguo 10-10-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: Feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 14
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
ZayDun,

Cita:
Empezado por ZayDun
...estoy utilizando la función ChangeFileHex...¿Hay alguna posibilidad de permitir que cambie independientemente del tamaño de la cadena?...


Te comento:

1- Si es posible, la clave esta en tener dos Buffers : Uno de entrada y otro de salida.

2- Voy a hacer unos cambios a la función ChangeFileHex y cuando este listo lo publico

Pregunto:

1- ¿Cual es el objetivo de esta aplicación?

2- ¿El uso de la aplicación es a nivel comercial, académico o personal?.

3- ¿En que país se usara la aplicación?.

Espero sea útil

Nelson.
Responder Con Cita
  #8  
Antiguo 10-10-2014
Avatar de ZayDun
ZayDun ZayDun is offline
Miembro
 
Registrado: Mar 2007
Posts: 128
Poder: 11
ZayDun Va por buen camino
Cita:
Empezado por nlsgarcia Ver Mensaje
ZayDun,




Te comento:

1- Si es posible, la clave esta en tener dos Buffers : Uno de entrada y otro de salida.

2- Voy a hacer unos cambios a la función ChangeFileHex y cuando este listo lo publico

Pregunto:

1- ¿Cual es el objetivo de esta aplicación?

2- ¿El uso de la aplicación es a nivel comercial, académico o personal?.

3- ¿En que país se usara la aplicación?.

Espero sea útil

Nelson.
Tengo un programa que al abrirlo trae los datos de configuración por defecto, el problema es que aunque cierre la aplicación con los nuevos datos el programa no los guarda y cada vez que lo abro tengo que volver a modificarlo todo, el archivo a modificar se guarda como config.dat y mi idea es que modifique la cadena y despues ejecute el programa.

El programa es para uso personal y el país es España.
Responder Con Cita
  #9  
Antiguo 10-10-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: Feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 14
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
ZayDun,

Cita:
Empezado por ZayDun
...Tengo un programa que al abrirlo trae los datos de configuración por defecto...


Pregunto:

1- ¿A que programa te refieres?, ¿Cual es el objetivo de esa aplicación?

2- ¿Cuales son los datos de configuración por defecto de la aplicación en cuestión que quieres modificar?.

Espero sea útil

Nelson.
Responder Con Cita
  #10  
Antiguo 10-10-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: Dec 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.904
Poder: 28
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola ZayDun.
Cita:
Empezado por ZayDun Ver Mensaje
...
tengo un archivo llamado "config.dat", lo he abierto con un editor de texto y aparecen caracteres codificados y entre ellos se encuentra la cadena que estoy buscando sin codificar, en principio mi idea era la de abrir, buscar, reemplazar y guardar, pero se me esta complicando el código para hacerlo,
...
Pero ahora no se como hacer para buscar dentro del archivo la cadena que estoy buscando.
En principio me siento obligado a comentarte que es una acción delicada, por lo que te recomiendo hacer una copia del archivo y realizar las pruebas sobre esta última.

Código Delphi [-]
procedure SearchAndReplace(const FileName: TFileName;
  const Searched, Replacement: string);
var
  Stream: TFileStream;
  i, cc : Integer;
  buf   : Char;
  start : Int64;
begin
  if Length(Searched) <> Length(Replacement) then
    raise Exception.Create('¡Las longitudes de las cadenas deben ser iguales!');

  Stream:= TFileStream.Create(FileName, fmOpenReadWrite);
  try
    cc   := 1;
    start:= -1;
    for i:= 0 to Stream.Size do
    begin
      Stream.Read(buf,SizeOf(buf));
      if cc-1 = Length(Searched) then
      begin
        start:= Stream.Position - Length(Searched)-1;
        Break;
      end;
      if buf = Searched[cc] then
        Inc(cc)
      else
        cc:= 1;
    end;
    Stream.Position:= start;
    for i:= 1 to Length(Searched) do
      Stream.Write(Replacement[i], SizeOf(buf));
  finally
    Stream.Free;
  end;
end;

Ejemplo de uso:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  SearchAndReplace('C:\pruebas\notepad2.exe',
    'This program cannot be run in DOS mode',
    'Este programa no ejecutara en modo DOS');
end;
Aunque probé el código y sé que realiza correctamente lo que buscas, insisto en que resguardes el original y trabajes sobre una copia. Hasta estar completamente seguro que la aplicación que usa ese archivo funcione después del cambio.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #11  
Antiguo 11-10-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: Feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 14
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
ZayDun,

Están pendientes las preguntas del Msg #9

Nelson.

Última edición por nlsgarcia fecha: 11-10-2014 a las 09:09:52.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Modificar archivo binario elarys Varios 1 21-10-2010 15:18:13
Funciones para limpiar y buscar una cadena en otra cadena o en un fichero xaguilars Trucos 1 29-07-2007 23:20:14
Funcion para buscar cadena dentro de otra cadena y el numero de veces flystar Varios 3 02-07-2007 23:48:08
Convertir a binario cadena de caracteres wgfs Varios 0 28-10-2006 01:58:28
Buscar cadena dentro de otra cadena doverzhoff Varios 4 27-01-2004 06:27:15


La franja horaria es GMT +2. Ahora son las 03:25:28.


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