Lecture fichier binaire et conversion hexa --> string

Résolu
kineton Messages postés 7 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 14 février 2005 - 9 févr. 2005 à 20:25
cbeyls Messages postés 31 Date d'inscription samedi 22 janvier 2005 Statut Membre Dernière intervention 13 mars 2005 - 12 févr. 2005 à 17:34
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

Athalus Messages postés 131 Date d'inscription jeudi 17 juin 2004 Statut Membre Dernière intervention 7 juillet 2005
11 févr. 2005 à 09:05
for(int i = 0; i < buffer_lecture.Length; i++)


{


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


}

Ca devait marcher

hum.......
3
cs_coq Messages postés 6351 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 99
11 févr. 2005 à 18:21
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#
3
kineton Messages postés 7 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 14 février 2005
11 févr. 2005 à 19:43
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;


}
3
Athalus Messages postés 131 Date d'inscription jeudi 17 juin 2004 Statut Membre Dernière intervention 7 juillet 2005
10 févr. 2005 à 08:53
Bonjour,

t'as essayé ?

result = LectureStreamReader.ReadString();

hum.......
0

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

Posez votre question
kineton Messages postés 7 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 14 février 2005
10 févr. 2005 à 19:55
bonsoir, merci d'avoir répondu mais ta solution ne fonctionne pas.
0
Athalus Messages postés 131 Date d'inscription jeudi 17 juin 2004 Statut Membre Dernière intervention 7 juillet 2005
10 févr. 2005 à 20:05
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.......
0
kineton Messages postés 7 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 14 février 2005
10 févr. 2005 à 20:30
Re,
j'y avais pensé mais cela me retourn System.Byte[].

Patiente et perséverence !!!!
0
Athalus Messages postés 131 Date d'inscription jeudi 17 juin 2004 Statut Membre Dernière intervention 7 juillet 2005
10 févr. 2005 à 21:05
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.......
0
kineton Messages postés 7 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 14 février 2005
11 févr. 2005 à 17:31
Cela fonctionne parfaitement.
Merci beaucoup à toi !!!
0
kineton Messages postés 7 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 14 février 2005
11 févr. 2005 à 19:36
Merci du conseil coq !!!!
Je vais tenir compte de ton précieux conseil !!!!
0
cbeyls Messages postés 31 Date d'inscription samedi 22 janvier 2005 Statut Membre Dernière intervention 13 mars 2005 1
12 févr. 2005 à 17:32
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

}

}
0
cbeyls Messages postés 31 Date d'inscription samedi 22 janvier 2005 Statut Membre Dernière intervention 13 mars 2005 1
12 févr. 2005 à 17:34
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];
0