Lecture fichier binaire et conversion hexa --> string [Résolu]

Signaler
Messages postés
7
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
14 février 2005
-
Messages postés
31
Date d'inscription
samedi 22 janvier 2005
Statut
Membre
Dernière intervention
13 mars 2005
-
Bonjour à tous,

Je suis développeur en vc++ 6.0 et je commence juste à programmer en C# avec VS.Net.
Je cherche à lire un fichier binaire qui contient 2 types d'informations :
* 1 partie d'entête avec des données que je souhaite convertir en chaine de caractère
* 1 partie de données avec des entiers codés sur 1 octets
J'ai un problème car je ne parviens pas à convertir les données lues de l'entête en chaine de caractère (pour faire ensuite uen vérification de format).

Pouvez vous m'aider ?


byte [] buffer_lecture;




Stream LectureStream = File.Open(chemin_fichier, FileMode.Open);


BinaryReader LectureStreamReader =
new BinaryReader (LectureStream);





string result="";



try


{
//lecture des 80 octets de l'entête


buffer_lecture = LectureStreamReader.ReadBytes(80);



string a;



int b;



for(
int i=0;i<buffer_lecture.Length;i++)


{ b=buffer_lecture[i];


???




}









}

12 réponses

Messages postés
131
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
7 juillet 2005

for(int i = 0; i < buffer_lecture.Length; i++)


{


result += Convert.ToChar(buffer_lecture[i]);


}

Ca devait marcher

hum.......
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
Attention aux concatenations de string dans une boucle, c'est loin d'être bon pour les perfs.
Utilisez plutôt System.Text.StringBuilder.

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
7
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
14 février 2005

Voila ma fonction fonctionne bien et pour aider d'autres débutants, je vous la livre.

Elle permet de lire une partie d'un fichier binaire (en l'occurance en entete de 80 octets qui m'intéresse) et de la transformer en chaine de caractère. Pour la démo, j'affiche ensuite un messagebox avec cette chaine de caractère.

Voila, longue vie à l'hirondelle qui fait le printemps !!!!!!!!!

***************************************************************
Faire un using System.Text;

puis :

public
int TraduireFichierBinaire(
string chemin_fichier)


{
//Vérification de l'entête du fichier



byte [] buffer_lecture=
null;




Stream LectureStream = File.Open(chemin_fichier, FileMode.Open);


BinaryReader LectureStreamReader =
new BinaryReader (LectureStream);





try


{
//lecture des 80 octets de l'entête


buffer_lecture = LectureStreamReader.ReadBytes(80);


StringBuilder toto =
new StringBuilder();



for(
int i = 0; i < buffer_lecture.Length; i++)


toto.Append(Convert.ToChar(buffer_lecture[i]));













MessageBox.Show (toto.ToString(), "Nom du fichier", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);


}



catch (IOException)


{


}


LectureStream.Close();


LectureStreamReader.Close();



return 0;


}
Messages postés
131
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
7 juillet 2005

Bonjour,

t'as essayé ?

result = LectureStreamReader.ReadString();

hum.......
Messages postés
7
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
14 février 2005

bonsoir, merci d'avoir répondu mais ta solution ne fonctionne pas.
Messages postés
131
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
7 juillet 2005

J'ai pas VS.net sous la main mais une fois que tu as lu tes 80 bytes
avec
buffer_lecture = LectureStreamReader.ReadBytes(80);

essaye de voir avec la méthode Convert.Tostring
result = Convert.Tostring(buffer_lecture) je sais pas si ca marche pas pu tester ...mais faut peut etre creuser autour

hum.......
Messages postés
7
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
14 février 2005

Re,
j'y avais pensé mais cela me retourn System.Byte[].

Patiente et perséverence !!!!
Messages postés
131
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
7 juillet 2005

Ha oui je me rapelle j'avais eu aussi ce problème.
Mais vu que je suis chez moi j'ai pas mon code sous la main, je te met ca en ligne demain matin, mais il me semble qu'avec les Convert c'etait la bonne voie

hum.......
Messages postés
7
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
14 février 2005

Cela fonctionne parfaitement.
Merci beaucoup à toi !!!
Messages postés
7
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
14 février 2005

Merci du conseil coq !!!!
Je vais tenir compte de ton précieux conseil !!!!
Messages postés
31
Date d'inscription
samedi 22 janvier 2005
Statut
Membre
Dernière intervention
13 mars 2005
1
Travailler byte par byte, ce n'est pas très clean tout ça, et
probablement pas très performant non plus étant donné que tu fais un
cast à chaque fois. Pourquoi ne pas utiliser un StreamReader? C'est
fait pour ça! Il suffit de déterminer d'abord l'encodage, ici il semble
que ce soit ANSI/ASCII, bref, un byte = un caractère, comme en C. et
les return 0 à la fin, c'est ce qu'on faisait à l'époque du C, ce qu'on
fait avec les langages modernes quand il y a une erreur c'est lever une
exception !



Ce qui donne:



public void TraduireFichierBinaire(string chemin_fichier)

{

Stream stream = File.Open(chemin_fichier, FileMode.Open);

StreamReader
streamReader = new StreamReader(stream, System.Text.Encoding.Default);

try

{

// Lit 80 bytes en encodage ANSI par défaut

byte[] buffer_lecture = new byte[80];


streamReader.Read(buffer_lecture, 0,
buffer_lecture.Length);

string toto = new string(buffer_lecture);


MessageBox.Show (toto, "Nom du fichier",
MessageBoxButtons.OK, MessageBoxIcon.Asterisk);

}

finally

{


streamReader.Close(); // Ferme également le Stream
sous-jacent

}

}
Messages postés
31
Date d'inscription
samedi 22 janvier 2005
Statut
Membre
Dernière intervention
13 mars 2005
1
J'ai fait un epetite erreur de distraction, ce n'est pas



byte[] buffer_lecture = new byte[80];



mais




char[] buffer_lecture = new char[80];