Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1425 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] Transformer un Array de Byte en String proprement ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C#] Transformer un Array de Byte en String proprement ?

n°996865
Arjuna
Aircraft Ident.: F-MBSD
Posté le 01-03-2005 à 10:21:04  profilanswer
 

Bonjour, j'ai pas mon code sous les yeux, mais disons que l'autre jour, je me suis heurté à un petit problème très con...
 
Je fait une requête HTTP avec l'objet httpreader (ou un nom comme ça)
Je récupère un stream, dans lequel je peux lire des array de Byte.
 
Deux questions :
-> Mon stream contient une suite de caractères au format ASCII simple. Est-ce qu'il y a un moyen de surcharger mon stream en streamreader, histoire de pouvoir faire des "getLine" ? (c'est un flux CSV en fait)
-> Si c'est impossible, une fois mettons que j'ai mon tampon de Bytes remplis, un byte[4096] Comment le changer en String ? Le seul truc que j'ai trouvé, c'est faire une boucle sur le tableau, et faire un "Convert.toString()" sur chaque byte et les concaténer, ce qui est très porc... Y'a pas moyen de faire mieu ? En effet, d'un point de vue représentation mémoire, à moins que je me trompe, il n'y a pourtant aucune différence entre un array de bytes et une chaîne de caractères, si ? (une chaîne de caractères, c'est bien un array de char, et un char est bien l'équivalent à un byte non ?)

mood
Publicité
Posté le 01-03-2005 à 10:21:04  profilanswer
 

n°996866
Arjuna
Aircraft Ident.: F-MBSD
Posté le 01-03-2005 à 10:21:50  profilanswer
 

PS: même si vous avez une solution pour le premier problème, je suis preneur d'une solution simple pour mon second, car c'est un problème que je me pose régulièrement (et dans l'autre sens aussi si possible ;))

n°999971
moi23372
Posté le 03-03-2005 à 18:30:17  profilanswer
 

un simple casting ne passerait il pas (j'ai pas testé)  
=> (STRING)
 
sinon je ne veux pas trop ce que tu pourrais faire a part comme tu l'as dis parcourir le tableau et concaténé, après tout je ne pense pas qu'une méthode ferait plus...

n°999983
FlorentG
Unité de Masse
Posté le 03-03-2005 à 18:45:34  profilanswer
 

Regarde dans System.Text. T'as une chouette classe Decoder qui permet de créer une String à partir d'un tableau d'octets :)

n°999988
FlorentG
Unité de Masse
Posté le 03-03-2005 à 18:47:57  profilanswer
 

Donc ça fera :

System.Text.ASCIIEncoding.GetDecoder().GetChars(byteArray, startIndex, length, charArray, charIndex)


Avec :

  • byteArray ton tableau d'octets
  • startIndex l'index de départ  
  • length le nombre d'octets
  • charArray un tableau de type char
  • charIndex l'index de départ dans charArray


Ensuite t'as juste à construire ta string à partir du tableau de char :)

n°1000027
Arjuna
Aircraft Ident.: F-MBSD
Posté le 03-03-2005 à 19:21:06  profilanswer
 

OK, merci FlorentG :)
 
C pas malin de pas avoir mis ça dans Convert, j'ai cherché là dedans, j'ai pas eu l'idée d'aller dans Text :)

n°1001285
Arjuna
Aircraft Ident.: F-MBSD
Posté le 04-03-2005 à 20:55:50  profilanswer
 

J'ai un souci, ça merde :D
 
Bon, vu que de toute façon, il faut que je fasse des readline dedans, et que j'ai pas envie de bouffer plein de mémoire avec les 280 Ko du fichier à traîter, j'ai décidé de passer par un fichier temporaire.
 
Seulement, j'ai un problème pour lire le dernier bout, qui est plus petit que le buffer : ça plante pas vraiment, mais le programme se bloque et ne fait rien (même symptôme si je met en chaîne de caractères).
 
Ci-dessous la class que j'ai fait :

Code :
  1. public class http
  2. {
  3.  const int BUF_SIZE = 4096;
  4.  public string Get(string host, string path, int port)
  5.  {
  6.   string res = "";
  7.   int lg;
  8.   try
  9.   {
  10.    System.IO.StreamWriter fic = new System.IO.StreamWriter("data.tmp", false, System.Text.Encoding.ASCII, BUF_SIZE);
  11.    System.Text.ASCIIEncoding a = new System.Text.ASCIIEncoding();
  12.                
  13.    System.Net.Sockets.TcpClient s = new System.Net.Sockets.TcpClient(host, port);
  14.    System.Net.Sockets.NetworkStream n = s.GetStream();
  15.    string req = "GET " + path + " HTTP/1.1\r\nHost: " + host + "\r\n\r\n";
  16.                
  17.    n.Write(a.GetBytes(req),0,req.Length);
  18.                
  19.    string head;
  20.    // on ne gère que le texte ( pas les images )
  21.    System.IO.StreamReader sr = new System.IO.StreamReader(n);
  22.    while ( (head = sr.ReadLine()).Length > 0 )
  23.    {
  24. //     res += head + "\r\n";
  25.    }
  26. //    res += "\r\n";
  27.    int size;
  28.    char[] buf = new char[BUF_SIZE];
  29.    while ( (lg = sr.Read(buf,0,BUF_SIZE)) > 0)
  30.    {
  31.     fic.Write(new String(buf).Substring(0,lg).Replace("\r\n","\n" ));
  32.    }
  33.    sr.Close();
  34.   }
  35.   catch (Exception e )
  36.   {
  37.    res = e.ToString();
  38.   }
  39.   return res;
  40.  }
  41. }


 
Ca bloque là :

Code :
  1. while ( (lg = sr.Read(buf,0,BUF_SIZE)) > 0)


(ou la ligne du dessous, je sais pas)

n°1001291
Arjuna
Aircraft Ident.: F-MBSD
Posté le 04-03-2005 à 20:56:55  profilanswer
 

Adresse lue (y'a peut-être une couille dans leur flux ?)
 
http://www.ivao.org/network/metar.asp

n°1001292
chrisbk
-
Posté le 04-03-2005 à 20:58:02  profilanswer
 

tu veux pas utiliser System.Net.Webclient ?

n°1001294
chrisbk
-
Posté le 04-03-2005 à 20:58:44  profilanswer
 

ah nan j'ai rien dit tu veux parser le header html [:petrus75]

mood
Publicité
Posté le 04-03-2005 à 20:58:44  profilanswer
 

n°1001296
Arjuna
Aircraft Ident.: F-MBSD
Posté le 04-03-2005 à 20:59:06  profilanswer
 

PS: pour la class, j'ai recopié bêtement ce code, que j'ai adapté pour l'occasion (en version originale, il y a le même problème) :
 
http://www.salemioche.com/http/http_prog10.php


Message édité par Arjuna le 04-03-2005 à 20:59:43
n°1001298
Arjuna
Aircraft Ident.: F-MBSD
Posté le 04-03-2005 à 21:00:45  profilanswer
 

chrisbk a écrit :

ah nan j'ai rien dit tu veux parser le header html [:petrus75]


Non, pas du tout, je ne veux pas parser le header html. je veux juste lire le contenu (flux ASCII).
 
Seulement, j'ai pas réussi à utiliser la classe WebClient (pas compris comment elle marche :D)

n°1001299
chrisbk
-
Posté le 04-03-2005 à 21:00:52  profilanswer
 

ménon chui con, webclient devrait faire ce que tu veux. si je comprends bien tu veux recup une page HTML ?

n°1001301
chrisbk
-
Posté le 04-03-2005 à 21:01:10  profilanswer
 

c'est tout con, bouge pas

n°1001306
chrisbk
-
Posté le 04-03-2005 à 21:04:29  profilanswer
 

Code :
  1. WebClient myWebClient = new WebClient();
  2. myWebClient.Headers.Add("Referer","tonreferrersilenfautun" );
  3. myWebClient.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705)" ); //idem c'est juste pour le camouflage  
  4. byte[] data = myWebClient.DownloadData("http://coicoin" ); //ou :
  5. myWebClient.DownloadFile("http://coicoin",@"c:\truc.html" );


 
le bricolage du header est optionnel, bien sur
 
Si tu veux accerder a un page qui attends des formulaires post, alors tu fais avant le downloadData  
 

Code :
  1. myWebClient.QueryString.Add("name","valeur" );


 
vala
 
 
décodage du texte :
 

Code :
  1. Encoding encode = Encoding.GetEncoding(1252); //iso 8859-1
  2. string str  = encode.GetString(data);


 
videmment fo utiliser le decodeur ad hoc :o


Message édité par chrisbk le 04-03-2005 à 21:07:03
n°1001309
Arjuna
Aircraft Ident.: F-MBSD
Posté le 04-03-2005 à 21:07:07  profilanswer
 

Arf, en effet ça marche beaucoup mieu :D
 

Code :
  1. string metarUrl = "http://www.ivao.org/network/metar.asp";
  2.   metarData = "";
  3.   System.Net.WebClient http = new System.Net.WebClient();
  4.   http.DownloadFile(metarUrl, "data.tmp" );
  5.   System.IO.StreamReader fic = new System.IO.StreamReader("data.tmp", System.Text.Encoding.ASCII, false, 4096);
  6.   string res = fic.ReadLine();
  7.   txtMetar.Text = res;


 
Comprend pas comment j'ai fait pour pas comprendre comment ça marchait :heink:

n°1001310
chrisbk
-
Posté le 04-03-2005 à 21:07:49  profilanswer
 

je pense a l'alcool [:el g]

n°1001312
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 04-03-2005 à 21:09:10  profilanswer
 

Arjuna >> utilise donc la classe HttpWebRequest, ça fait exactement ce que tu veux


---------------
J'ai un string dans l'array (Paris Hilton)
n°1001313
chrisbk
-
Posté le 04-03-2005 à 21:09:50  profilanswer
 

degage harko, j'ai deja posé ma marque sur ce topic [:kbchris]

n°1001325
Arjuna
Aircraft Ident.: F-MBSD
Posté le 04-03-2005 à 21:32:58  profilanswer
 

Merci beaucoup en tout cas :)
 
Bon, reste plus qu'à coder l'application maintenant :D


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] Transformer un Array de Byte en String proprement ?

 

Sujets relatifs
Metaprg + Stringrecuperation string d'un JTextField
Portage d'une vieille appli delphi + invalid typecast de string(PChar)pb de sessions (Unknown column 'Array' in 'where clause' )
mysql_real_escape_string non reconnue ?Conversion String utf8
Incrémenter un stringUtilisaton de String.replaceAll
[XHTML/CSS] Bien débuter, et coder un design proprement[C#] Réinitialiser un tableau de byte
Plus de sujets relatifs à : [C#] Transformer un Array de Byte en String proprement ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR