【问题标题】:String not printing as expected字符串未按预期打印
【发布时间】:2011-03-28 22:20:38
【问题描述】:

您能否解释一下为什么“输出”窗口不打印字符串的“xxxxx”部分? 看起来我对某事缺少一些基本的了解...?

我正在通过 TcpClient 发送字符串消息,并且在构建字符串时,我不会在发送方添加任何特殊字符,也不会在接收方添加任何特殊字符。这是问题的一部分吗?

http://i56.tinypic.com/9lg7pi.png


编辑:

我正在像这样在发送方构建我的字符串:

Private Sub SendData(ByVal stringArray As String())
    SendData(GetMessageString(stringArray))
End Sub

Public Function GetMessageString(ByVal array As String()) As String
    Dim str As String = ""
    For i = 0 To array.Length - 1
        str = str & array(i)
        If i < array.Length - 1 Then
            str = str & "|"
        End If
    Next
    Return str
End Function

在接收端,变量被构建:

     client.GetStream.BeginRead(readBodyBuffer, 0, MESSAGE_BODY_LENGTH, New AsyncCallback(AddressOf ReadBody), Nothing)

    ...

Private Sub ReadBody(ByVal aread As IAsyncResult)

      BytesRead = client.GetStream.EndRead(aread)

    ...

          ' Read (add) into buffer
      messagePart = Encoding.ASCII.GetString(readBodyBuffer)
      messagePart = messagePart & "xxxxx"

编辑 3

我的简单错误是错误地使用了字节数组的 Redim: (参数 10 给出 11 个元素)

错误:

 ReDim readBodyBuffer(MESSAGE_BODY_LENGTH)

正确:

 ReDim readBodyBuffer(MESSAGE_BODY_LENGTH - 1)

【问题讨论】:

    标签: .net vb.net string tcpclient


    【解决方案1】:

    我相信它在某种程度上与不可打印的字符有关。例如这个 C# 代码:

    string message = "Hello\0 Hello2";
    Debug.Print(message);
    

    这里我有一个结尾为空字符的字符串。在调试可视化器中,它的显示方式与我创建此字符串的方式相同 - "Hello\0 Hello2"。但在输出窗口中它不显示\0,甚至截断Hello 2。所以我认为这与您的问题有关,尽管我无法完全重现它。检查您的messagePart.Length

    更新:好的,所以在这里和另一个答案中浏览了所有这些 cmets 之后,我认为问题是由 readBodyBuffer 的错误使用引起的。这取决于您如何分配此缓冲区,但我希望您只是创建一个具有固定 (11) 长度的新字节数组。然后,您将忽略实际接收到的字节数(10)并使用 ASCII 编码从该数组转换字符串。 BytesRead 小于分配的缓冲区大小的事实导致数组中的最后一个字节为零。您应该使用接受length 参数的Encoding.ASCII.GetString 方法,这样您就不会在结果字符串中收到\0

    messagePart = Encoding.ASCII.GetString(readBodyBuffer, 0, ReadBytes)
    

    【讨论】:

    • 嗯.. 是的,messagePart 长度为 16,比我预期的多一个字符。虽然我不知道这是在哪里添加的?我编辑了一些关于上面如何处理字符串的细节。
    • @bretddog,你能把readBodyBuffer的内容转储吗?我怀疑问题出在10 索引中。
    • @Snowbear:对不起,你的意思是“转储内容”?字符串是“CONNECTED|”
    • @bretddog,我的意思是你应该打印readBodyBuffer数组的内容。它应该像[67, 79, ...
    • 我明白了。它打印:67 79 78 78 69 67 84 69 68 124 0
    【解决方案2】:

    同意雪熊。

    您能否在您的消息中打印空白字符的字符代码?空间应该是 32。

    Debug.Print(AscW(messagePart(10)))
    

    【讨论】:

    • 不确定这是什么意思,但如果我打印: Debug.Print(AscW(messagePart)) 它输出 67 ?
    • @bretddog - 67 是 C 字符的 ascii 代码,它是字符串中的第一个字符,您需要在 messagePart 中打印 10 索引的 ascii 代码
    • 这个零是使用Debug.Print函数时的问题。要解决此问题,您可以在传递给函数之前删除或替换此零。像这样:message.Replace(ChrW(0), " ")
    • 我明白了.. 但是为什么一开始是零呢?在从多个部分构建消息时,我应该从每个接收到的字符串的末尾删除它吗?
    • 请不要将变通方法视为一个好的解决方案。消息末尾的零字符可能也会在系统的其他部分引起问题。现在是总结所有细节并做出决定的好时机。
    猜你喜欢
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多