NetworkStream.read()读取所有字节,但不会转换为字符串

时间:2018-10-04 14:16:34

标签: c# string visual-studio unity3d networkstream

在尝试使用networkStream.read()通过以下代码登录时,我试图读取服务器的响应:

if (connectionStream.DataAvailable && connectionStream.CanRead)
{
    byte[] myReadBuffer = new byte[64];
    string responseMessage = string.Empty;
    int numberOfBytesRead = 0;
    do
    {
        numberOfBytesRead = connectionStream.Read(myReadBuffer, 0, myReadBuffer.Length);
        responseMessage = Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead);

    } while (connectionStream.DataAvailable);

    Debug.Log("Message:" + responseMessage);

    #breakpoint 
    if (responseMessage.Contains("OK"))
    {
        Debug.Log("logon sucessful");
    }
    else
    {
        Debug.LogError("Logon denied!");
    }
}

通过检查breakpoint处的局部变量,我知道Read()已被正确执行,因为numberOfBytesRead设置为32,并且myReadBuffer充满了32个字节(全部myReadBuffer中的字节与服务器发送的字节匹配)。但是,在尝试使用myReadbufferEncoding.ASCII.GetString()中提取字符串之后,即使myReadBuffer不是,该字符串仍然为空(Visual Studio也说它在断点处为空)。

myReadBuffer中的字节为:

32 0 0 0
1 0 0 0
0 0 0 0
76 79 71 79
78 58 32 48
59 79 75 59
32 83 83 61
54 66 67 0

转换为:_ _ _ _ _ _ _ _ _ _ L O G O N : 0 ; O K ; S S = 5 A 8 _

关于什么会导致这种情况的任何建议?

1 个答案:

答案 0 :(得分:0)

来自服务器的响应包含一些null ('\0')字符。尽管Strings (C#)上的文档说到了C#中的空终止:

  

C#字符串的末尾没有以null结尾的字符;因此,C#字符串可以包含任意数量的嵌入式空字符('\ 0')。

Unity似乎不符合此要求,实际上确实在遇到null字符后终止了字符串。虽然我在统一文档中找不到对此的任何引用。

我最终要解决的问题是用空格替换空字符(也可以完全删除空字符,但我想知道某个时刻有空字符),例如:responseMessage = responseMessage.Replace('\x0', '\x0020');

在创建此帖子时,我已经弄清楚了,但是找不到关于我的问题的其他帖子。因此,请自己回答,以备将来参考。如果有人有其他/更好的解决方案或其他信息,我仍然很高兴听到/接受。