PDA

Ver la Versión Completa : Modificar archivo binario


elarys
20-10-2010, 22:47:00
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.


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.


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.