22 Votos

Lazarus: Cargar Archivo como Array de Bytes y Guardar Array de Bytes como Archivo

Tutorial de Delphieño | 02/04/2021 a las 19:29

En este tutorial, quiero mostrarle cómo leer un archivo byte por byte en una array y cómo escribir una array de bytes en un archivo nuevamente.

Primero, definamos una matriz de bytes:

type
  TByteArr = array of Byte;

Ahora podemos llenarlo con algunos bytes individuales:

var
  BA: TByteArr;
begin
  SetLength(BA, 3);
  BA[0] := 65;
  BA[1] := $41;
  BA[2] := %1000001;

Por lo tanto, no importa si especificamos los bytes en notación decimal, hexadecimal o binaria.

65 es el código ASCII para "A". En notación hexadecimal, el número 65 corresponde a 41 y en notación binaria a 1000001.

En el ejemplo, establecemos los tres bytes en el mismo valor. Los valores decimales se pueden escribir como números enteros simples en el código, los números hexadecimales se indican con $ y los números binarios con %.

Guardar Matriz de Bytes

Ahora veamos cómo podemos guardar nuestra matriz de bytes en un archivo. Para ello usamos la siguiente función:

procedure SaveByteArray(AByteArray: TByteArr; const AFileName: string);
var
  Stream: TStream;
begin

  if FileExistsUTF8(AFileName) then DeleteFileUTF8(AFileName);

  Stream := TFileStreamUTF8.Create(AFileName, fmCreate);
  try
     Stream.WriteBuffer(Pointer(AByteArray)^, Length(AByteArray));
  finally
     Stream.Free;
  end;

end;  

Un ejemplo de uso puede verse así:

var
  BA: TByteArr;
begin
  SetLength(BA, 1);
  BA[0] := 65;
  SaveByteArray(BA, 'archivo.dat');

Como primer parámetro pasamos nuestra matriz de bytes, como segundo parámetro el nombre de archivo deseado.

Cargar Matriz de Bytes

Para cargar un archivo desde el disco duro en una matriz de bytes, la siguiente función es útil:

function LoadByteArray(const AFileName: string): TByteArr;
var
  Stream: TStream;
  DataLeft: Integer;
begin
  SetLength(result, 0);

  if not FileExistsUTF8(AFileName) then exit;

  Stream := TFileStreamUTF8.Create(AFileName, fmOpenRead or fmShareDenyWrite);
  try
     stream.Position:=0;
     DataLeft := Stream.Size;
     SetLength(result, DataLeft div SizeOf(Byte));
     Stream.Read(PByte(result)^, DataLeft);
  finally
     Stream.Free;
  end;

end; 

Una llamada a la función puede verse así:

var
  BA: TByteArr;
begin
  BA := LoadByteArray('file.dat');

Solo pasamos un nombre de archivo como parámetro y recuperamos la matriz de bytes.

Visualizar Matriz de Bytes

Cuando se trabaja con matrices de bytes, tarde o temprano surge la cuestión de mostrar el contenido de la matriz de bytes. Tiene sentido generar las matrices de bytes en forma hexadecimal como una cadena / string. Por ejemplo, una salida de la matriz de bytes mencionada anteriormente se vería así: "41 41 41".

ResponderPositivoNegativo

Sobre el Autor

AvatarEl autor aún no ha agregado una breve descripción del perfil.
Ver Perfil

 

Temas Relacionados

¿Cómo abrir un archivo TAR.GZ?

Pregunta | 1 Respuesta

Aviso Importante

Por favor tenga en cuenta: Las contribuciones publicadas en askingbox.com son contribuciones de los usuarios y no deben reemplazar el asesoramiento profesional. No son verificados por independientes y no reflejan necesariamente la opinión de askingbox.com. Aprende más.

Participar

Haga su propia pregunta o escriba su propio artículo en askingbox.com. He aquí cómo.