Comment puis-je obtenir la longueur (c'est-à-dire le nombre de caractères) d'une chaîne ASCII dans VB.NET?

StackOverflow https://stackoverflow.com/questions/1005164

Question

J'utilise ce code pour renvoyer une chaîne d'un tcpclient, mais lorsque cette chaîne est renvoyée, il est précédé d'un caractère " . J'essaie de le supprimer, 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 telle que je l'utilise normalement et non du tableau sous-jacent à la chaîne elle-même?

 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.

Était-ce utile?

La solution

Votre code est actuellement quelque peu cassé. La réponse est tcpClient.ReceiveBufferSize , quel que soit le nombre de données réellement reçues - car vous ignorez la valeur renvoyée par networkStream.Read . Cela pourrait ne renvoyer que quelques octets, mais vous créez quand même une chaîne en utilisant le reste du tableau octets . Toujours vérifiez la valeur de retour de Stream.Read , car sinon vous ne savez pas combien de données ont été 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 inversement), de sorte que la longueur de la chaîne sera exactement la même que celle des données que vous avez reçues.

Sachez que toutes les données non-ASCII (c'est-à-dire les octets supérieurs à 127) seront converties en "?" par Encoding.ASCII.GetString . Vous pouvez également obtenir des caractères de contrôle. S'agit-il bien de données texte ASCII pour commencer? Si ce n'est pas le cas, je vous recommande de le coder au format hexadécimal ou d'utiliser une autre option pour transférer les données exactes sans perte.

Autres conseils

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

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

Si Len indique le nombre d'octets et qu'il ne correspond pas au nombre de caractères, deux possibilités s'offrent à vous:

  • Il y a plus de caractères envoyés que vous ne le pensez (c'est-à-dire que ce caractère supplémentaire est effectivement envoyé)

  • Le codage n’est pas ASCII. Il peut donc y avoir plus d’un octet par caractère (et l’un d’eux est ce caractère "étrange", c’est-à-dire que le caractère est envoyé et ne constitue pas une "donnée erronée"). Essayez de savoir si les données sont vraiment encodées en ASCII. Sinon, modifiez l’appel en conséquence.

Lorsque je vous ai bien lu, vous obtenez un guillemet simple au début, n'est-ce pas?

Si vous obtenez celui-ci systématiquement, pourquoi ne pas simplement soustraire un de la longueur de la chaîne? Ou utilisez une sous-chaîne du deuxième caractère:

Len(returndata.Substring(1)

Et je ne comprends pas très bien ce que vous voulez dire par "la longueur de la chaîne telle que je l'utilise normalement et non par le tableau sous-jacent à la chaîne elle-même". Tu as une ficelle. Tout tableau pouvant représenter cette chaîne en interne dépend entièrement de la mise en œuvre et ne doit en aucun cas être visualisé. 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 transformer la longueur de la chaîne après en une chose que vous utiliseriez normalement?

Peut-être qu'il me manque quelque chose ici, mais ce qui ne va pas avec String.Length ?

Dim LL As Int32 = returndata.Length
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top