Fichier hexa

e14273 Messages postés 12 Date d'inscription jeudi 20 avril 2006 Statut Membre Dernière intervention 9 juin 2006 - 9 juin 2006 à 12:30
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 10 juin 2006 à 16:37
bonjour à tous,


je veux lire un fichier texte qui contient des caractères, lorqu'on l'ouvre avec ultraedit on peut avoir la conversion en
code hexadécimal et c'est ce code hexadécimal qui m'intéresse
Je lis donc le fichier texte puis convertit chaque caractère en hexa, mais dans ce fichier texte pour un caractère particulier, il y a parfois plusieurs interprétation du code hexadecimal.
Je voulais savoir s'il y avait moyen de lire directement le fichier en hexa sans avoir recourt à une conversion
pour éviter la perte d'information

merci

5 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 juin 2006 à 13:05
Cette source devrait réaliser ce que tu souhaite:
http://0217021.free.fr/Cours/my_exDump.dpr
0
e14273 Messages postés 12 Date d'inscription jeudi 20 avril 2006 Statut Membre Dernière intervention 9 juin 2006
9 juin 2006 à 14:25
c'est la meme chose que ce ke j'ai fait en fait,
il y a une fonction   qui traduit les character en code hexa

cette fonction

Function CharToHex(caractere:char):string;
var
 Ascii:cardinal;           "integer"
begin
 Ascii:=Ord(caractere);     
 result:=IntToHex(Ascii,2);
end;

mais si tu test ce programme sur des fichiers qui contiennent le caractère 'SUB' par exemple, qui a pour code hexa '1A' et bien ça ne marchera pas
c'est pour ça que je voulais lire directement l'hexa, sans traduire, mais je sais pas si c'est possible 
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 juin 2006 à 21:12
Oui, je vois ce que tu veux dire et c'est tout a fait possible.

Il faut que tu ouvre ton fichier avec TFileStream, puis que tu lise octet par octet. Renseigne toi sur le TFileStream (touche F1 + source sur ce site).
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
9 juin 2006 à 23:00
Le code hexadécimal 1A est équivalent à 26 en décimal (ou encore ^Z). C'est aussi le caractère indiquant la fin d'un fichier texte.
Comme le suggère CptPingu, utilise un TFileStream et tu n'auras pas ce souci.
Mais pourquoi n'utilises-tu pas la fonction Eof pour arrêter la lecture du fichier juste avant d'avoir atteint la fin ?

May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
10 juin 2006 à 16:37
pour lire un fichier en hexa et formatter ensuite les valeur, il faut utiliser un tableau de byte de profondeur 16 :

THexLigne : array[0..15] of byte;

chaque ligne comporte 16 valeur (numerotée de 00 a 0F)
et chaque ligne possede au debut un compteur de ligne qui indique l'offset de la ligne (0x00000000)

exemple :
           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F  
0x00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x00000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x000000A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x000000B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

ce qui nous donnerais avec un TfileStream :

<hr size="2" width="100%" />
type
  { nous sert de buffer pour recuperer les octets du fichier }
  THexaLine = array[0..15] of byte;

{ convertis un THexaLine en caractere dans l'interval ascii 32..126 }
function HexaLineToChr(const HL : THexaLine; const Size : integer) : string;
var
  P: PChar;
  I: Integer;
begin
  { la taille de la chaine depend de Size }
  SetLength(result, Size);
  P := PChar(result);
  for I := 0 to Size-1 do begin
      case HL[I] of
        { si on est dans l'interval 32..126 on affiche le caractere correspondant }
        32..126 : P[0] := chr(HL[I]);
        else
          { sinon on affiche un point (.) }
          P[0] := #46;
      end;
      Inc(P);
  end;
end;

{ convertis un THexaLine en sa representation byte --> chaine }
function HexaLineToStr(const HL : THexaLine; const Size : integer) : string;
var
  P: PChar;
  I: Integer;
const
  Digits: array[0..15] of Char = '0123456789ABCDEF';
begin
  { le retour fait toujours 47 caracteres }
  SetLength(result, 47);
  P := PChar(result);
  for I := 0 to 15 do begin
    { si on est inferieur a la taille du buffer }
    if I < Size then begin
       { on convertis le byte en sa valeur chaine (hexa) }
       P[0] := Digits[HL[I] shr 4];
       P[1] := Digits[HL[I] and $F];
    end else begin
       { sinon on mets deux underscores pour montrer a l'utilisateur qu'il n'y a plus rien }
       P[0] := '_';
       P[1] := '_';
    end;

    { si on est inferieur a la taille du buffer -1 }
    if I < Size-1 then begin
       { on ajoute un espace et on incremente P de 3 }
       P[2] := #32;
       Inc(P,3);
    end else
       { sinon on incremente P de 2 (fin de ligne) }
       Inc(P,2);
  end;
end;

{ Lit un fichier et affiche son contenus dans un TStrings (tmemo, tlistbox)
  on utilise la police "Courier New" pour un meilleur affichage }
procedure ReadFile(const Filename : string; Strs : TStrings);
var Buffer  : THexaLine;   { le buffer }
    Count,N : cardinal;    { compteur offset de ligne | taille du buffer }
    TSL     : TStringList; { tstringlist temporaire pour ne pas ecrire directement dans Strs }
    TFS     : TFileStream; { }
begin
   TSL := nil; { on nilliize pour eviter les erreur de liberation }
   TFS := nil; { }
   try
     { on crée la stringlist et on place les offsets de colones }
     TSL := TStringList.Create;
     TSL.Add('            00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F');

     { on init count a 0 }
     count := 0;

     { si le fichier existe }
     if FileExists(FileName) then begin
        { on crée le stream et on ouvre le fichier en mode lecture seule }
        TFS := TFileStream.Create(FileName, fmOpenRead);
        { on se place au debut (inutile mais plus sur) }
        TFS.Seek(0,soFromBeginning);
        { boucle de lecture du fichier }
        repeat
          { on lit le buffer et on recupere la taille lue }
          N := TFS.Read(Buffer,SizeOf(Buffer));
          { on place le buffer dans une chaine qu'on ajoute dans la liste
            offset ligne (hex) | valeur hexa (hex) | caracteres (char) }
          TSL.Add( format('0x%.8x  %s  %s',[ Count,
                                             HexaLineToStr(Buffer,N),
                                             HexaLineToChr(Buffer,N)] ) );
          { on incremente le compteur avec la taille N }
          inc(Count,N);

        { si le compteur est egale a la taille du stream (fin du fichier) on arrete la boucle }
        until count = TFS.Size;
     end;

     { on assigne les chaines de TSL a STRS }
     Strs.Assign(TSL);
   finally
     { on libere la liste temporaire et le stream }
     TFS.Free;
     TSL.Free;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  { on ouvre un fichier et on assigne le resultat a ListBox1 }
  if OpenDialog1.Execute then
     ReadFile(OpenDialog1.FileName, ListBox1.Items);
end;

<hr size="2" width="100%" />
et voilou ... simple non ?
0
Rejoignez-nous