0

我正在使用此代码从 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()报告字节数而不是字符串中的字符数。

4

5 回答 5

5

您的代码目前有些损坏。答案是,无论您实际tcpClient.ReceiveBufferSize收到多少数据- 因为您忽略了来自. 它可能只返回几个字节,但无论如何您都在使用数组的其余部分创建一个字符串。始终检查 的返回值,否则您不知道实际读取了多少数据。您应该执行以下操作:networkStream.ReadbytesStream.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文本数据开始吗?如果不是,我建议对其进行十六进制编码或使用其他选项以无损方式转储确切的数据。

于 2009-06-17T05:30:06.670 回答
0

您可以尝试在对 Len() 的调用中修剪字符串:

Dim LL As Int32 = Len(returndata.Trim())
于 2009-06-17T04:52:30.990 回答
0

如果 Len 报告的字节数和字符数不匹配,那么我可以想到两种可能:

  • 发送的字符比您想象的要多(即,实际上正在发送额外的字符)

  • 编码不是 ASCII,因此每个字符可以有多个字节(其中之一是“奇怪”字符,即正在发送的字符不是“错误数据”)。尝试找出数据是否真的是 ASCII 编码的,如果不是,则相应地更改调用。

于 2009-06-17T05:09:14.030 回答
0

当我没看错时,你会在开头得到一个单引号,对吧?

如果你一直得到那个,为什么不从字符串长度中减去一个呢?或者使用第二个字符的子字符串:

Len(returndata.Substring(1)

而且我不太明白您所说的»字符串的长度,因为我通常会使用它,而不是字符串本身的数组的长度«。你有一个字符串。任何可能在内部表示该字符串的数组都完全依赖于实现,您不应该看到或依赖任何内容。或者我在这里误会你了。该字符串您通常使用的字符串。我的意思是,如果这不是你所做的,那么为什么不把字符串的长度处理成你通常使用的东西呢?

于 2009-06-17T05:09:54.263 回答
0

也许我在这里遗漏了一些东西,但是有什么问题String.Length

Dim LL As Int32 = returndata.Length
于 2009-06-17T05:24:34.540 回答