11 Stimme

Lazarus: Datei als Byte Array laden und Byte Array als Datei speichern

Tutorial von Delphianer | Letztes Update am 02.04.2021 | Erstellt am 14.11.2013

In diesem Tutorial möchte ich euch zeigen, wie ihr eine Datei Byte für Byte in einen Array lesen könnt und wie ihr einen Byte Array auch wieder in eine Datei schreiben könnt.

Zunächst definieren wir uns einen Byte Array:

type
  TByteArr = array of Byte;

Diesen können wir jetzt zum Beispiel so mit einzelnen Bytes füllen:

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

Dabei spielt es keine Rolle, ob wir die Bytes in dezimaler, hexadezimaler oder binärer Schreibweise angeben.

65 ist der ASCII Code für "A". In hexadezimaler Schreibweise entspricht die Zahl 65 der 41 und in binärer Schreibweise der 1000001.

Wir setzen im Beispiel also alle drei Bytes auf den gleichen Wert. Dezimale Angaben können als einfache Integer-Zahlen in den Code geschrieben werden, hexadezimale werden mit $ gekennzeichnet und binäre mit %.

Byte Array speichern

Nun möchten wir uns ansehen, wie wir unseren Byte Array in eine Datei speichern können. Dazu benutzen wir die folgende Funktion:

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;  

Ein Aufruf könnte so aussehen:

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

Als ersten Parameter übergeben wir unseren Byte Array, als zweiten den Dateinamen.

Byte Array laden

Um eine Datei von der Festplatte in einen Byte Array zu laden, bietet sich folgende Funktion an:

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; 

Ein Aufruf der Funktion kann so aussehen:

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

Wir geben als Parameter nur einen Dateinamen an und bekommen den Byte Array zurück.

Byte Array visualisieren

Bei der Arbeit mit Byte Arrays kommt früher oder später die Frage nach dem Inhalt des Byte Arrays auf. Dazu bietet es sich an, die Byte Arrays in hexadezimaler Form als String auszugeben. Damit würde eine Ausgabe des oben genannten Byte Arrays zum Beispiel so aussehen: "41 41 41".

AntwortenPositivNegativ

Über den Autor

AvatarDer Autor hat keine Kurzbeschreibung seines Profils angegeben.
Profil anzeigen

 

Ähnliche Themen

Wichtiger Hinweis

Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.

Jetzt mitmachen

Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.