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".
Sobre el Autor
Puede 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
Delphi/Lazarus: Mostrar Array de Bytes como Cadena de Valores HEX
Consejo | 0 Comentarios
Script Batch: Apagar Computadora Windows
Tutorial | 2 Comentarios
MySQL: Saltos de Línea en MySQL
Consejo | 0 Comentarios
jQuery: Leer y Cambiar los Valores de los Atributos Data
Tutorial | 0 Comentarios
Delphi/Lazarus: Cargar Byte Array desde MemoryStream
Pregunta | 1 Respuesta
PHP: Guardar Resultado de MySQL en Array
Información | 0 Comentarios
Poner Windows via Script en Hibernación o Modo de Suspensión
Tutorial | 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.