我正在使用此代码从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()
报告字节数而不是字符串中的字符数。
答案 0 :(得分:5)
您的代码目前有些破碎。答案是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文本数据吗?如果不是,我建议使用十六进制编码或使用其他选项以无损方式转储确切数据。
答案 1 :(得分:0)
您可以尝试修改Len()调用中的字符串:
Dim LL As Int32 = Len(returndata.Trim())
答案 2 :(得分:0)
如果Len报告字节数且与字符数不匹配,那么我可以想到两种可能性:
发送的字符数量超出您的想象(即实际发送的额外字符数)
编码不是ASCII,因此每个字符可以有多个字节(其中一个是'怪异'字符,即字符正在发送而不是'错误数据')。尝试确定数据是否真的是ASCII编码,如果没有,请相应地更改呼叫。
答案 3 :(得分:0)
当我正确读到你时,你会在开头有一个引号,对吗?
如果你一直得到那个,为什么不从字符串长度中减去一个呢?或者使用第二个字符的子字符串:
Len(returndata.Substring(1)
我不太明白你的意思»字符串的长度,正如我通常使用它而不是字符串本身的数组«。你有一个字符串。任何可能在内部表示该字符串的数组都完全依赖于实现,您应该看到或依赖的任何内容。或者我在这里弄错了。字符串是您正常使用的内容。我的意思是,如果那不是你做的,那么为什么不把之后的字符串的长度加工成你通常使用的东西?
答案 4 :(得分:0)
也许我在这里遗漏了一些东西,但是String.Length
出了什么问题?
Dim LL As Int32 = returndata.Length