Как получить длину (то есть количество символов) строки ASCII в VB.NET? - PullRequest
0 голосов
/ 17 июня 2009

Я использую этот код, чтобы вернуть некоторую строку из 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() сообщает количество байтов, а не количество символов в строке.

Ответы [ 5 ]

5 голосов
/ 17 июня 2009

Ваш код в настоящее время несколько сломан. Ответ - 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 для начала? Если это не так, я бы порекомендовал его закодировать в шестнадцатеричном формате или использовать какой-либо другой параметр для сброса точных данных без потерь.

0 голосов
/ 17 июня 2009

Может быть, я что-то здесь упускаю, но что не так с String.Length?

Dim LL As Int32 = returndata.Length
0 голосов
/ 17 июня 2009

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

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

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

0 голосов
/ 17 июня 2009

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

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

Len(returndata.Substring(1)

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

0 голосов
/ 17 июня 2009

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

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