如何在VB.NET中获取ASCII字符串的长度(即字符数)?

时间:2009-06-17 04:47:12

标签: vb.net string ascii tcpclient

我正在使用此代码从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 个答案:

答案 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