2009-02-13 10 views
0
// Reads NetworkStream into a byte buffer. 

NetworkStream ns; 
System.Net.Sockets.TcpClient client = new TcpClient(); 

byte[] receiveBytes = new byte[client.ReceiveBufferSize]; 
ns.Read(receiveBytes, 0, (int)client.ReceiveBufferSize); 
String returndata = Encoding.UTF8.GetString(receiveBytes); 

Je réussis à lire à partir d'un client et à stocker le résultat dans une chaîne appelée returndata. Cependant, lorsque j'essaie de concaténer des returndata avec n'importe quoi, aucune concaténation ne se produit. Ex: String.Concat (returndata, "test") renvoie returndata, tout comme returndata + "test".La chaîne C# ne concaténera pas

Est-ce que quelqu'un sait pourquoi cela se produit?

Éditer: Steve W est correct; J'ai découvert plus tard que returndata.Length renvoyait toujours 8192.

+0

Serait mieux si vous montriez le code réel que vous rencontrez des problèmes avec. Vous avez posté le code que vous avez travaillé et négligé le code que vous n'avez pas. – AnthonyWJones

+0

Pouvez-vous inclure le code pour la concaténation? –

+0

@tacogordito: Avez-vous vérifié la valeur de retour de ns.Read()? –

Répondre

4

Je crois que le problème est lié à ne pas garder une trace du nombre total d'octets lus. Votre tampon d'octets, défini sur ReceiveBufferSize, est plus que probablement plus grand que le nombre réel d'octets lus. En prenant en compte les octets réels lus, puis en les passant à la méthode Encoding.UTF8.GetString(), vous devez obtenir une chaîne valide qui peut être concaténée. Voici un exemple:


NetworkStream ns; 
System.Net.Sockets.TcpClient client = new TcpClient(); 

byte[] receiveBytes = new byte[client.ReceiveBufferSize]; 
int bytesRead = ns.Read(receiveBytes, 0, receiveBytes.Length); 
String returndata = Encoding.UTF8.GetString(receiveBytes,0,bytesRead); 
returndata = returndata.Trim(new char[] {'\0'}); 

Notez également l'autre suggestion au sujet de la lecture d'un terminateur nul et y compris dans les octets lus pourrait également être un problème. J'ai inclus un découpage de la chaîne pour m'assurer que les terminateurs NULL sont supprimés.

5

L'attribuez-vous à une chaîne ou à lui-même?

returndata = string.Concat(returndata, "test"); 
returndata += "test"; 
+0

Débogage psychique - il faut l'aimer :) – ShuggyCoUk

2

Les chaînes sont immuables. Cela signifie que lorsque vous ajoutez (concaténer) une autre chaîne à votre chaîne, vous recevez une nouvelle instance de chaîne.
La chaîne d'origine elle-même ne sera pas modifiée.

3

je vais avoir une estimation:

La chaîne reçue comprend une terminaison '\ 0'. Vous devriez être en mesure de vérifier cela avec le débogueur.

+0

Excellente suggestion, compte tenu du contexte. +1 –

+0

Je mets mes paris là-dessus aussi. – Timbo

+0

Mauvais. Seules les chaînes C sont terminées par un caractère nul. –

5

Pour développer la réponse de jhunter, la méthode Concat ne modifie pas le contenu de la variable de chaîne d'origine, renvoie simplement le résultat concaténé. Si vous voulez que returndata contienne le résultat de la concaténation, vous devez utiliser returndata = string.Concat(returndata, "test").

+0

juste la méthode Concat, la méthode NO modifie directement les chaînes en C#. Chaque chaîne est un objet unique et immuable. Si vous changez une chaîne, elle en fait une nouvelle copie. – abelenky

+0

C'est vrai - mauvais choix de mots de ma part. –

Questions connexes