Frage

Ich verwende diesen Code, um einen String von einem TCPClient zurückzugeben, aber wenn die Zeichenfolge zurückkommt " Charakter darin. Ich versuche es zu entfernen, aber die Len() Die Funktion liest die Anzahl der Bytes anstelle der Zeichenfolge selbst. Wie kann ich dies ändern, um mir die Länge der Saite zu geben, da ich sie normalerweise und nicht des Arrays, das der Zeichenfolge selbst zugrunde liegt?

 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() Meldet die Anzahl der Bytes nicht die Anzahl der Zeichen in der Zeichenfolge.

War es hilfreich?

Lösung

Ihr Code ist derzeit etwas kaputt. Die Antwort ist tcpClient.ReceiveBufferSize, unabhängig davon, wie viel Daten Sie Daten haben eigentlich erhalten - weil Sie den Rückgabewert von ignorieren networkStream.Read. Es könnte nur ein paar Bytes zurückkehren, aber Sie erstellen eine Zeichenfolge mit dem Rest der bytes Array sowieso. Stets Überprüfen Sie den Rückgabewert von Stream.Read, weil Sie sonst nicht wissen, wie viel Daten tatsächlich gelesen wurden. Sie sollten so etwas tun wie:

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)

Jetzt hat ASCII immer ein einzelnes Zeichen pro Byte (und umgekehrt), sodass die Länge der Zeichenfolge genau der Länge der von Ihnen erhaltenen Daten entspricht.

Seien Sie sich bewusst, dass Nicht-ASCII-Daten (dh irgendwelche Bytes über 127) in '?' durch Encoding.ASCII.GetString. Sie können auch Kontrollfiguren erhalten. Ist dies definitiv ASCII -Textdaten? Wenn dies nicht der Fall ist, würde ich das Hex-Codieren empfehlen oder eine andere Option verwenden, um die genauen Daten auf nicht verletzte Weise abzuwerfen.

Andere Tipps

Sie können versuchen, die Zeichenfolge im Anruf nach Len () zu schneiden:

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

Wenn Len die Anzahl der Bytes meldet und nicht mit der Anzahl der Zeichen übereinstimmt, kann ich mir zwei Möglichkeiten vorstellen:

  • Es werden mehr Schmale gesendet, als Sie denken (dh dieser zusätzliche Charakter wird tatsächlich gesendet)

  • Die Codierung ist kein ASCII, daher kann es mehr als ein Byte pro Zeichen geben (und einer von ihnen ist dieser "seltsame" Charakter, das ist der Charakter, der gesendet wird und keine "falschen Daten" ist). Versuchen Sie herauszufinden, ob die Daten wirklich ascii codiert sind, wenn nicht, ändern Sie den Anruf entsprechend.

Wenn ich dich richtig gelesen habe, bekommst du am Anfang ein einzelnes Anführungszeichen, oder?

Wenn Sie das konsequent bekommen, warum nicht einfach eine von der Saitenlänge subtrahieren? Oder verwenden Sie ein Substring vom zweiten Charakter:

Len(returndata.Substring(1)

Und ich verstehe nicht ganz, was Sie mit der Länge der Zeichenfolge meinen, da ich sie normalerweise verwenden würde und nicht von dem Array, das der Zeichenfolge selbst zugrunde liegt «. Sie haben eine Zeichenfolge. Jedes Array, das darstellen könnte, dass die Zeichenfolge intern vollständig implementierungsabhängig ist, und nichts, worauf Sie sehen oder sich verlassen sollten. Oder verstehe ich dich hier falsch. Die Saite ist Was Sie normal verwenden. Ich meine, wenn das nicht das ist, was Sie tun, warum dann nicht die Länge der Saite nehmen nach Verarbeiten Sie es in etwas, das Sie normalerweise verwenden würden?

Vielleicht fehlt mir hier etwas, aber was ist los mit String.Length?

Dim LL As Int32 = returndata.Length
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top