2011-04-06 6 views
0

J'essayais de saisir la longueur de chaîne de readData mais quand j'essaye msgbox (readData.Length), son me donnant un grand chiffre numérique à la place. Quelqu'un veut-il aider? Merci.Trouble reading String Longueur

Dim readData as string 
serverStream.Read(inStream, 0, buffSize) 
       Dim returndata As String = _ 
       System.Text.Encoding.ASCII.GetString(inStream) 
       readData = "" + returndata 
       msg() 
+1

S'il vous plaît voir http://meta.stackexchange.com/questions/16721/how-does-accept-rate-work –

Répondre

3

Vous devez utiliser la valeur de retour de Stream.Read, et seulement créer la chaîne des octets qui ont été effectivement lus:

Dim bytesRead = serverStream.Read(inStream, 0, buffSize) 
Dim text = Encoding.ASCII.GetString(inStream, 0, bytesRead) 

Notez, cependant, que vous devriez habituellement continuer à lire à partir un flux jusqu'à ce qu'il n'y ait plus de données à lire. StreamReader peut vous aider à faire ce vraiment simplement, si vous essayez de convertir tout en une chaîne:

Dim text = new StreamReader(serverStream, Encoding.ASCII).ReadToEnd() 

(je suppose que vous fermez le flux ailleurs, sinon, vous devez fermer la StreamReader dans un enfin bloquer.)

Etes-vous absolument sûr que les données seront toujours ASCII, soit dit en passant? Cela signifie que vous n'aurez jamais de caractères accentués, etc.

Si quelque chose n'est toujours pas clair après avoir lu les réponses de Guffa et moi-même, veuillez envoyer plus de détails de exactement ce que vous essayez de faire.

+0

Merci Jon Skeet et tout pour les explications et les pointeurs. – k80sg

2

Vous faites l'erreur tout à fait commun d'ignorer la valeur de retour de la méthode Read.

La méthode va lire les données dans le tampon et retourner le nombre d'octets qui a été placé dans le tampon. En ignorant cette valeur de retour et en décodant le tampon entier, la chaîne sera aussi longue que le tampon et contiendra beaucoup de données parasites à la fin.

De même, vous devez appeler la méthode Read à plusieurs reprises jusqu'à ce qu'elle renvoie zéro, car la méthode n'a pas à retourner toutes les données en un appel.

Dim readData As string 
Dim length As Integer = 0 
Dim size As Integer 
Do 
    size = serverStream.Read(inStream, length, buffSize - length) 
    length += size 
Loop Until size = 0 
readData = System.Text.Encoding.ASCII.GetString(inStream, 0, length) 

MessageBox.Show(length.ToString()) 
MessageBox.Show(readData.Length.ToString()) 

Comme vous utilisez l'encodage ASCII, length et readData.Length sera le même, que chaque octet est décodé en un seul caractère. Si vous utilisiez par exemple le codage UTF-8, ils pourraient différer, car length serait le nombre d'octets lus et readData.Length serait le nombre de caractères que ces octets ont été décodés.

+0

Cela va seulement lire * jusqu'à * 'buffSize' octets, bien sûr - ça ne va pas continuer jusqu'à ce qu'il n'y ait plus de données. Si le but est de continuer à tout lire et que le serveur se déconnecte, il devra continuer à lire après avoir rempli le tampon. Si le serveur * ne déconnecte pas, lire jusqu'à ce que le tampon soit rempli est également susceptible de se bloquer. Sauf si la taille de la mémoire tampon a été spécifiée * par * le serveur, bien sûr. –

+0

@Jon Skeet: Oui, c'est un bon point. Le code suppose que le tampon est toujours assez grand pour contenir toutes les données. – Guffa