2011-10-22 1 views
1

Ces jours-ci, je suis confronté à un problème avec la chaîne de codage d'un tableau d'octets. J'utilise une socket pour recevoir les données du serveur vers un tampon, puis je crée un MemoryStream pour lire les données de ce tampon dans un tempBuffer avec une longueur fixe de 30 à plus tard GetString de tempBuffer.Encoding.UTF8.GetString ne fonctionne pas correctement avec les données reçues du socket

byte tempBuff = new byte[30]; 
streamReader.Read(tempBuff, 0, 30); 
string moTaSkill = Encoding.UTF8.GetString(tempBuff); 

Le J'utilise une zone de texte pour afficher cette chaîne comme ci-dessous:

tbSkill.Text = moTaSkill; 

Il affichent toujours tort sur la zone de texte:

  1. Quand debug je vois moTaSkill = « CompéteNCes de le héros "
  2. Lorsque l'affichage sur le textBox il suffit de" Compétence de "ou parfois" Compétence "ou" Compétence de la "

J'ai essayé de créer le tempBuffer avec la longueur égale à la longueur de la chaîne que je recevrai. Mais pas de succès.

Quelqu'un peut-il me dire une solution pour le réparer?

Répondre

1

Deux problèmes. Vous oubliez de faire attention à la valeur de retour de l'appel Read(). Il vous indique combien d'octets réels ont été copiés dans tempBuf. Ce que vous devez ensuite utiliser dans la méthode GetString() pour éviter la conversion de zéros.

Deuxième problème est qu'une connexion TCP fournit un réseau flux, pas un paquet. Il est assez imprévisible combien d'octets vous obtiendrez pour chaque appel Read(). Encore une fois, la valeur de retour vous le dit. Cela ne correspondra qu'au nombre d'octets transmis accidentellement par le serveur. Vous devez continuer à appeler Read() jusqu'à ce que vous les obteniez tous.Le principal problème avec cela est que vous ne savez pas nécessairement quand la lecture est terminée. Le serveur devra transmettre des données supplémentaires afin que le récepteur le sache. Comme envoyer la longueur de la chaîne en premier.

0

Vous devez utiliser la commande flush dans votre code puisque tout le buffer doit être réinitialisé.

télécharger le code où vous remplissez le tampon

0

Nous aurons besoin de plus de code, mais je vais vous dire ce qui se passe.

Votre TextBox utilise les contrôles Windows standard. Les contrôles Windows standard arrêtent d'écrire au premier caractère \0 (nul en C/C++). C'est parce qu'ils utilisent "C String" qui est un tableau de caractères terminés par nul. Votre chaîne contient celles-ci, probablement parce que vous les avez incorrectement copiées quelque part. Le Visual Studio affiche la chaîne complète, car il peut afficher \0 caractères. Essayez de faire: int ix = moTaSkill.IndexOf('\0');

+0

Merci à tous pour votre aide, la raison est un caractère nul à la fin de la chaîne. J'ai fait quelque chose quand copier des données dans le tampon. – lemycanh

0

Le problème principal ici est que vous assumez que Read remplit votre tampon; Ce n'est pas sûr. Vous devez appeler Read et vérifier la valeur de retour pour voir combien d'octets ont été lus. Tout ce qui vous est garanti est < = 0 (pour EOF) ou> 0 et < = compte (sinon EOF). Cela signifie souvent faire une boucle, ajouter un décalage et réduire le nombre chaque fois. Pour aider à cela, il est courant d'indiquer (en premier lieu) la longueur des données à suivre, ainsi vous savez quand arrêter. Vous pouvez également utiliser EOF pour arrêter, mais évidemment uniquement si le canal n'est pas une conversation bidirectionnelle de longue durée.

Vous devriez également essayer de coder les données réelles; Si 14 octets ont été lus, vous devez dire à l'encodeur de ne regarder que 14 octets, même si le tampon est plus grand.

Questions connexes