e14273
Messages postés12Date d'inscriptionjeudi 20 avril 2006StatutMembreDernière intervention 9 juin 2006
-
9 juin 2006 à 12:30
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 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
e14273
Messages postés12Date d'inscriptionjeudi 20 avril 2006StatutMembreDerniè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
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 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).
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 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)
<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 ?