【问题标题】:How do I get the length (i.e. number of characters) of an ASCII string in VB.NET?如何在 VB.NET 中获取 ASCII 字符串的长度(即字符数)?
【发布时间】:2009-06-17 13:30:06
【问题描述】:

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

【问题讨论】:

  • LEN 应该可以工作。您可能想查看各个字符/字节以了解其中的实际内容。

标签: vb.net string ascii tcpclient


【解决方案1】:

您的代码目前有些损坏。答案是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文本数据开始吗?如果不是,我建议对其进行十六进制编码或使用其他选项以无损方式转储确切的数据。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        如果我没看错,你会得到一个单引号,对吧?

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

        Len(returndata.Substring(1)
        

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

        【讨论】:

          【解决方案5】:

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

          Dim LL As Int32 = returndata.Length
          

          【讨论】:

          • 没什么,但是完全等价于Len
          猜你喜欢
          • 2011-05-13
          • 2021-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多