Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Modificar archivo binario (https://www.clubdelphi.com/foros/showthread.php?t=70440)

elarys 20-10-2010 22:47:00

Modificar archivo binario
 
hola, me lei otros hilos del mismo tema, pero tengo una particularidad, en este archivo no tengo un registro de los datos, si no que investigando necesito modificar un buffer de 32 byte de un archivo en binario.
Deberia investigar si el buffer de 32 que necesito viene siempre en la misma posicion y no hacerme problemas en la lectura.

Ahora a los echos, lo que me han pedido es que apartir de ese buffer de 32 byte lo levanto en distintas TEdit, osea tengo 32 TEdit con los datos levantados, hasta ahi todo bien, ahora el usuario modificara esos datos que le muestro en los TEdit y debo reemplazarlos, osea hacer un write al archivo, otra cosa el archivo a modificar es de 8 megas aproximadamente, siempre es mas o menos lo mismo, tambien he estado probando leyendo el archivo con un lector hexadecimal y parece que dicho buffer viene 4 veces en el mismo archivo en distintas posiciones, solo el primer buffer viene siempre en la misma posicion, deberia confirmar eso... hay alguna forma de buscar con los 32 byte que tengo y guardar o sobreescribir los 32 nuevos, en las 4 apariciones... por mi cuenta lo puedo hacer por medio de algun lector hexadecimal pero necesito algo entendible para el usuario.

Por ahora tengo el codigo de lectura.

Código Delphi [-]
procedure TfrmMain.btnAbrirClick(Sender: TObject);
var
  fstram: TFileStream;
  buffer: array[0..31] of byte;
  i:integer;
begin
  //busco el archivo con un open dialog
  if opdAbrir.Execute() then
  begin
    //lo leo en modo lectura
    fstram := TFileStream.Create(opdAbrir.FileName, fmOpenRead);
    //mientras no sea el final del archivo   
    while fstram.Position < fstram.Size do
    begin
      //con este for limbio de basura el buffer
      for i := 0 to 32 - 1 do
      begin
        buffer[i] := 0;
      end;
      //leo el buffer de 32
      fstram.Read(buffer, 32);
      //lo que se que el buffer en la posicion 0 debe ser 0
      //y en la posicion 1 debe ser 192
      //si no es asi tengo que seguir leyendo
      if (buffer[0] = 0) and (buffer[1] = 192) then
      begin
        //Levanto los datos y termino el while
        //TEdit0.Text := buffer[0];
        //TEdit1.Text := buffer[1];
        //TEdit2.Text := buffer[2];
        //etc...
        exit;
      end;
    end;
    fstram.Free;
  end
  else
  begin
    //No eligio ningun archivo
  end;
end;

Necesito ayuda con el codigo que me sobreescribira los datos nuevos.
Tengo este codigo que saque del blog de delphiallimite, pero me falta alguna ayuda para lo que quiero hacer.

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;

Disculpen si me hice lio para explicar lo que necesito, espero que me sepan entender.

elarys 21-10-2010 14:18:13

se complico... me pasaron archivos nuevos y veo que no siempre vienen los datos en la misma posicion y no se como buscarlos... lo que hice fue abrir el programa con que se crean, cargar el archivo y abrir el .exe donde esta el programa con los datos cargados con TSearch que es un lector hexadecimal... asi puedo abrir los datos y modificar pero de esta forma lo hago manualmente como se podria hacer mas facil para el usuario.


La franja horaria es GMT +2. Ahora son las 16:02:20.

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