33 Votos

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

Tutorial de Stefan Trost | Última actualización el 18/02/2023 | Creado el 02/04/2021

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, definimos una matriz de bytes que necesitamos para ambos procesos respectivamente direcciones:

type
  TByteArr = array of Byte;

Ahora podemos llenarlo con algunos bytes individuales, por ejemplo de la siguiente manera:

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

Al hacerlo, no importa si especificamos los bytes en notación decimal, hexadecimal o binaria o si los obtenemos de una función como ord(), por ejemplo. El código de ejemplo muestra cada una de estas cuatro posibilidades.

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. También ord('A') nos da el valor ASCII 65 para "A".

En consecuencia, en el ejemplo, establecemos los cuatro bytes de la matriz en el mismo valor. Los valores decimales se pueden escribir como números enteros simples en el código, mientras que los valores hexadecimales se marcan con $ y los números binarios con %. De esta manera, el compilador puede distinguir a qué número nos referimos.

Guardar Matriz de Bytes

Ahora veamos cómo podemos guardar nuestra matriz de bytes en un archivo. Para esto usamos el siguiente procedimiento, al que podemos pasar una matriz de bytes y nuestro nombre de archivo deseado para el almacenamiento:

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

  if FileExistsUTF8(AFileName) then DeleteFileUTF8(AFileName);

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

end;  

En primer lugar, comprobamos si ya existe un archivo con el nombre especificado y lo borramos si es así. Alternativamente, por supuesto, también podríamos preguntarle al usuario antes de eliminar el archivo existente, pero aquí nos gustaría limitarnos a lo esencial. Luego creamos un FileStream y escribimos la matriz en toda su longitud en ello. Con esto, la matriz de bytes se guarda.

Un ejemplo de uso puede verse así:

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

Aquí primero creamos una matriz de bytes que consta de dos elementos y luego usamos el procedimiento que acabamos de presentar para el almacenamiento. Como primer parámetro pasamos nuestra matriz de bytes al procedimiento, como segundo parámetro el nombre del archivo deseado.

Cargar Matriz de Bytes

Ahora también queremos ver el camino inverso. Para cargar un archivo desde el disco duro en una matriz de bytes, se puede utilizar la siguiente función, a la que podemos pasar un nombre de archivo como parámetro:

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

  if not FileExistsUTF8(AFileName) then exit;

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

end; 

También en este procedimiento, primero verificamos si existe un archivo con el nombre de archivo especificado y terminamos si no. Anteriormente, ya establecimos el resultado en una longitud de 0, por lo que la función devuelve una matriz vacía en este caso. Si el archivo existe, también creamos un FileStream en esta función, que usamos para leer todos los bytes del archivo en nuestra matriz de bytes de resultado.

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

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

Solo pasamos un nombre de archivo como parámetro y recuperamos la matriz de bytes que consta de los bytes del archivo solicitado.

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 41".

ResponderPositivoNegativo

Sobre el Autor

AvatarPuede encontrar software de Stefan Trost en la pagina es.sttmedia.com. ¿Necesita un software individual según sus propios requisitos? Escribenos: es.sttmedia.com/contacto
Ver Perfil

 

Temas Relacionados

MySQL: Saltos de Línea en MySQL

Consejo | 0 Comentarios

PHP: Guardar Resultado de MySQL en Array

Información | 0 Comentarios

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.