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