Как мне получить длину (т. е.количество символов) строки ASCII в VB.NET ?

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

Вопрос

Я использую этот код, чтобы вернуть некоторую строку из tcpclient, но когда строка возвращается, у нее есть ведущая " характер в нем есть.Я пытаюсь удалить его, но Len() функция считывает количество байтов вместо самой строки.Как я могу изменить это, чтобы получить длину строки, которую я обычно использую, а не массива, лежащего в основе самой строки?

 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() сообщает количество байтов, а не количество символов в строке.

Это было полезно?

Решение

Ваш код в настоящее время несколько сломан. Ответ - tcpClient.ReceiveBufferSize , независимо от того, сколько данных вы фактически получили - потому что вы игнорируете возвращаемое значение из networkStream.Read . Он может возвращать всего несколько байтов, но вы все равно создаете строку, используя оставшуюся часть массива bytes . Всегда проверяйте возвращаемое значение Stream.Read , потому что в противном случае вы не знаете, сколько данных действительно было прочитано. Вы должны сделать что-то вроде:

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)

Теперь ASCII всегда имеет один символ на байт (и наоборот), поэтому длина строки будет в точности соответствовать длине полученных вами данных.

Имейте в виду, что любые не-ASCII-данные (т.е. любые байты более 127) будут преобразованы в '?' Encoding.ASCII.GetString . Вы также можете получить контрольные символы. Это определенно текстовые данные ASCII для начала? Если это не так, я бы порекомендовал использовать шестнадцатеричное кодирование или использовать какой-либо другой вариант для сброса точных данных без потерь.

Другие советы

Вы можете попробовать обрезать строку внутри вызова Len ():

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

Если Len сообщает количество байтов, и оно не соответствует количеству символов, то я могу придумать две возможности:

  • Отправляется больше символов, чем вы думаете (т. е. этот дополнительный символ действительно отправляется)

  • Кодировка не ASCII, поэтому на символ может приходиться более одного байта (и один из них - это "странный" символ, то есть символ отправляется и не является "неправильными данными").Попробуйте выяснить, действительно ли данные закодированы в формате ASCII, если нет, измените вызов соответствующим образом.

Когда я вас правильно прочитал, в начале вы получите одинарную кавычку, верно?

Если вы получаете это последовательно, почему бы просто не вычесть одно из длины строки? Или используйте подстроку из второго символа:

Len(returndata.Substring(1)

И я не совсем понимаю, что вы имеете в виду под & # 187; длиной строки, поскольку я обычно использовал бы ее, а не массив, лежащий в основе самой строки & # 171 ;. У вас есть строка. Любой массив, который может представлять эту строку внутри, полностью зависит от реализации и ничего, на что вы не должны смотреть или на что можно положиться. Или я вас неправильно понял. Строка - это то, что вы обычно используете. Я имею в виду, что если это не то, что вы делаете, то почему бы не взять длину строки после обработки в то, что вы обычно используете?

Возможно, я что-то здесь упускаю, но что не так с <код> string.length ?

Dim LL As Int32 = returndata.Length
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top