2009-06-17 8 views
0

J'utilise ce code pour renvoyer une chaîne à partir d'un tcpclient, mais quand la chaîne revient, elle contient un caractère ". J'essaye de l'enlever mais la fonction Len() lit le nombre d'octets au lieu de la chaîne elle-même. Comment puis-je modifier cela pour me donner la longueur de la chaîne comme je l'utiliserais normalement et non le tableau sous-jacent à la chaîne elle-même?Comment obtenir la longueur (c'est-à-dire le nombre de caractères) d'une chaîne ASCII dans VB.NET?

Dim bytes(tcpClient.ReceiveBufferSize) As Byte 
networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize)) 

' Output the data received from the host to the console.' 
Dim returndata As String = Encoding.ASCII.GetString(bytes) 

Dim LL As Int32 = Len(returndata) 

Len() indique le nombre d'octets et non le nombre de caractères de la chaîne.

+0

LEN devrait fonctionner. Vous pourriez vouloir regarder les chars/bytes individuels pour voir ce qui est vraiment là. – RBarryYoung

Répondre

5

Votre code est actuellement en panne. La réponse est tcpClient.ReceiveBufferSize, quelle que soit la quantité de données que vous avez réellement reçue - parce que vous ignorez la valeur de retour de networkStream.Read. Cela peut renvoyer seulement quelques octets, mais vous créez une chaîne en utilisant le reste du tableau bytes de toute façon. Toujours vérifiez la valeur de retour de Stream.Read, car vous ne connaissez pas la quantité de données réellement lues. Vous devriez faire quelque chose comme:

Dim bytesRead = networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize)) 

' Output the data received from the host to the console.' 
Dim returndata As String = Encoding.ASCII.GetString(bytes, 0, bytesRead) 

Maintenant, ASCII a toujours un seul caractère par octet (et vice versa) de sorte que la longueur de la chaîne sera exactement la même que la longueur des données que vous avez reçu.Sachez que toute donnée non ASCII (c'est-à-dire n'importe quel octet supérieur à 127) sera convertie en '?' par Encoding.ASCII.GetString. Vous pouvez également obtenir des caractères de contrôle. Est-ce que ce sont des données texte ASCII pour commencer? Si ce n'est pas le cas, je recommanderais l'encodage hexadécimal ou l'utilisation d'une autre option pour sauvegarder les données exactes sans perte.

0

Vous pouvez essayer de limiter la chaîne dans l'appel à Len():

Dim LL As Int32 = Len(returndata.Trim()) 
+0

ne fonctionne pas, j'ai juste essayé. – Middletone

0

Si Len indique le nombre d'octets et il ne correspond pas au nombre de caractères, alors je peux penser à deux possibilités :

  • Il y a

  • plus être envoyés caractères que vous pensez (à savoir que le caractère supplémentaire est réellement envoyé) l'encodage n'est pas ASCII, de sorte que le re peut être de plus d'un octet par caractère (et l'un d'entre eux est ce caractère «étrange», c'est-à-dire que le caractère est envoyé et n'est pas une 'mauvaise donnée'). Essayez de savoir si les données sont réellement encodées en ASCII, sinon changez l'appel en conséquence.

0

Lorsque je vous lis correctement, vous obtenez un guillemet simple au début, non?

Si vous obtenez cela uniformément, pourquoi ne pas en soustraire un à la longueur de la chaîne? Ou utiliser une sous-chaîne à partir du second caractère:

Len(returndata.Substring(1) 

Je ne comprends pas tout à fait ce que vous entendez »la longueur de la chaîne que je normalement l'utiliser et non de tableau sous-jacent de la chaîne elle-même«. Vous avez une chaîne. Tout tableau qui pourrait représenter cette chaîne en interne dépend entièrement de l'implémentation et rien de ce que vous devriez voir ou compter. Ou est-ce que je me trompe ici? La chaîne est ce que vous utilisez normalement. Je veux dire, si ce n'est pas ce que vous faites, alors pourquoi ne pas prendre la longueur de la chaîne après en le transformant en quelque chose que vous utiliseriez normalement?

0

Peut-être qu'il me manque quelque chose ici, mais quel est le problème avec String.Length?

Dim LL As Int32 = returndata.Length 
+0

Rien, mais c'est exactement équivalent à Len – MarkJ

Questions connexes