你能解释为什么输出窗口不打印字符串的“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)
答案 0 :(得分:2)
我认为它与某些不可打印的角色有关。例如这个C#代码:
string message = "Hello\0 Hello2";
Debug.Print(message);
这里我有一个结尾为空字符的字符串。在调试可视化工具中,它的显示方式与创建此字符串的方式相同 - "Hello\0 Hello2"
。但是在输出窗口中,它不会显示\0
,甚至会截断Hello 2
。所以我认为它与你的问题有关,虽然我无法完全重现它。检查您的messagePart.Length
。
更新:好的,所以在这里完成所有这些评论后,在另一个答案中我认为问题是由readBodyBuffer
的错误使用引起的。这取决于你如何分配这个缓冲区,但我希望你只是创建一个具有固定(11)长度的新字节数组。然后你忽略了实际接收的字节数(10)并使用ASCII编码从该数组转换字符串。 BytesRead
小于分配的缓冲区大小的事实导致数组中的最后一个字节为零的事实。您应该使用接受Encoding.ASCII.GetString
参数的length
方法,这样您就不会在结果字符串中收到\0
:
messagePart = Encoding.ASCII.GetString(readBodyBuffer, 0, ReadBytes)
答案 1 :(得分:0)
同意Snowbear。
您可以在邮件中打印空格的字符代码吗?空间应为32。
Debug.Print(AscW(messagePart(10)))