在尝试使用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
中的字节与服务器发送的字节匹配)。但是,在尝试使用myReadbuffer
从Encoding.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 _
关于什么会导致这种情况的任何建议?
答案 0 :(得分:0)
来自服务器的响应包含一些null ('\0')
字符。尽管Strings (C#)上的文档说到了C#中的空终止:
C#字符串的末尾没有以null结尾的字符;因此,C#字符串可以包含任意数量的嵌入式空字符('\ 0')。
Unity似乎不符合此要求,实际上确实在遇到null
字符后终止了字符串。虽然我在统一文档中找不到对此的任何引用。
我最终要解决的问题是用空格替换空字符(也可以完全删除空字符,但我想知道某个时刻有空字符),例如:responseMessage = responseMessage.Replace('\x0', '\x0020');
在创建此帖子时,我已经弄清楚了,但是找不到关于我的问题的其他帖子。因此,请自己回答,以备将来参考。如果有人有其他/更好的解决方案或其他信息,我仍然很高兴听到/接受。