33 Voix

Lazarus: Charger Fichier en tant que Array d'Octets et Enregistrer Array d'Octets en tant que Fichier

Tutoriel de Stefan Trost | Dernière mise à jour le 18/02/2023 | Créé le 02/04/2021

Dans ce didacticiel, je veux vous montrer comment lire un fichier octet par octet dans un array et comment réécrire un array d'octets dans un fichier.

Tout d'abord, nous définissons un tableau d'octets dont nous avons besoin pour les deux processus respectivement directions:

type
  TByteArr = array of Byte;

Nous pouvons maintenant le remplir avec quelques octets individuels, par exemple de la manière suivante:

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

Ce faisant, peu importe si nous spécifions les octets en notation décimale, hexadécimale ou binaire ou si nous les obtenons d'une fonction comme ord(), par exemple. L'exemple de code montre chacune de ces quatre possibilités.

65 est le code ASCII pour "A". En notation hexadécimale, le nombre 65 correspond à 41 et en notation binaire à 1000001. Aussi ord('A') nous donne la valeur ASCII 65 pour "A".

En conséquence, dans l'exemple, nous définissons les quatre octets du tableau sur la même valeur. Les valeurs décimales peuvent être écrites sous forme de nombres entiers simples dans le code tandis que les valeurs hexadécimales doivent être marquées par $ et les nombres binaires par %. De cette façon, le compilateur peut distinguer de quel nombre nous parlons.

Enregistrer Tableau d'Octets

Voyons maintenant comment nous pouvons enregistrer notre tableau d'octets dans un fichier. Pour cela, nous utilisons la procédure suivante, à laquelle nous pouvons transmettre un tableau d'octets et le nom de fichier souhaité pour le stockage:

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;  

Tout d'abord, nous vérifions si un fichier avec le nom spécifié existe déjà et le supprimons si c'est le cas. Alternativement, nous pourrions bien sûr également demander à l'utilisateur avant de supprimer le fichier existant, mais ici nous voudrions nous limiter à l'essentiel. Ensuite, nous créons un FileStream et y écrivons le tableau dans toute sa longueur dans ça. Avec cela, le tableau d'octets est enregistré.

Un exemple d'utilisation peut ressembler à ceci:

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

Ici, nous créons d'abord un tableau d'octets composé de deux éléments, puis nous utilisons la procédure qui vient d'être présentée pour le stockage. Comme premier paramètre, nous passons notre tableau d'octets à la procédure, comme deuxième paramètre le nom de fichier souhaité.

Charger un Tableau d'Octets

Maintenant, nous voulons également voir le chemin inverse. Pour charger un fichier du disque dur dans un tableau d'octets, nous pouvons utiliser la fonction suivante, à laquelle nous pouvons passer un nom de fichier comme paramètre:

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; 

Toujours dans cette procédure, d'abord, nous vérifions si un fichier existe sous le nom de fichier spécifié et nous terminons si ce n'est pas le cas. Auparavant, nous avions déjà défini le résultat sur une longueur de 0, donc la fonction renvoie un tableau vide dans ce cas. Si le fichier existe, nous créons également un FileStream dans cette fonction, que nous utilisons pour lire tous les octets du fichier dans notre tableau d'octets de résultat.

Un appel à la fonction peut ressembler à ceci:

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

Nous passons uniquement un nom de fichier cpmme paramètre et récupérons le tableau d'octets composé des octets du fichier demandé.

Visualiser Tableau d'Octets

Lorsque vous travaillez avec des tableaux d'octets, la question de l'affichage du contenu du tableau d'octets se pose tôt ou tard. Il est logique de générer les tableaux d'octets sous forme hexadécimale sous forme de chaîne / string. Par exemple, une sortie du tableau d'octets mentionné ci-dessus ressemblerait à ceci: "41 41 41 41".

RépondrePositifNégatif

Sur l’Auteur

AvatarVous pouvez trouver des logiciels de Stefan Trost sur fr.sttmedia.com. Avez-vous besoin d'un logiciel personnalisé selon vos propres besoins? Écrivez-nous: fr.sttmedia.com/contact
Voir Profil

 

Sujets Connexes

VirtualBox: Changer la Date et l'Heure

Tutoriel | 10 Commentaires

CSS: Comment inclure CSS dans HTML

Tutoriel | 0 Commentaires

Avis Important

Veuillez noter: Les contributions publiées sur askingbox.com sont des contributions d’utilisateurs et ne doivent pas remplacer les conseils d’un professionnel. Ils ne sont pas vérifiés par des indépendants et ne reflètent pas nécessairement l’opinion de askingbox.com. Apprendre encore plus.

Participer

Posez votre propre question ou écrivez votre propre article sur askingbox.com. Voici comment.