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

Transformer un Array de Byte en String proprement ? [C#] - C#/.NET managed - Programmation

Marsh Posté le 01-03-2005 à 10:21:04    

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 ?)

Reply

Marsh Posté le 01-03-2005 à 10:21:04   

Reply

Marsh Posté le 01-03-2005 à 10:21:50    

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 ;))

Reply

Marsh Posté le 03-03-2005 à 18:30:17    

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...

Reply

Marsh Posté le 03-03-2005 à 18:45:34    

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

Reply

Marsh Posté le 03-03-2005 à 18:47:57    

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 :)

Reply

Marsh Posté le 03-03-2005 à 19:21:06    

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 :)

Reply

Marsh Posté le 04-03-2005 à 20:55:50    

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)

Reply

Marsh Posté le 04-03-2005 à 20:56:55    

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

Reply

Marsh Posté le 04-03-2005 à 20:58:02    

tu veux pas utiliser System.Net.Webclient ?

Reply

Marsh Posté le 04-03-2005 à 20:58:44    

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

Reply

Marsh Posté le 04-03-2005 à 20:58:44   

Reply

Marsh Posté le 04-03-2005 à 20:59:06    

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
Reply

Marsh Posté le 04-03-2005 à 21:00:45    

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)

Reply

Marsh Posté le 04-03-2005 à 21:00:52    

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

Reply

Marsh Posté le 04-03-2005 à 21:01:10    

c'est tout con, bouge pas

Reply

Marsh Posté le 04-03-2005 à 21:04:29    

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
Reply

Marsh Posté le 04-03-2005 à 21:07:07    

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:

Reply

Marsh Posté le 04-03-2005 à 21:07:49    

je pense a l'alcool [:el g]

Reply

Marsh Posté le 04-03-2005 à 21:09:10    

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


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 04-03-2005 à 21:09:50    

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

Reply

Marsh Posté le 04-03-2005 à 21:32:58    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed