今天在做一个小实验的时候,发现了一个换行的疑问。
void ShowMsg(string str) { txtLog.AppendText(str + "\r\n"); }
Socket socketSend = o as Socket; while (true) { try { byte[] buffer = new byte[1024 * 1024 ]; int r = socketSend.Receive(buffer); if (r == 0) { break; } string str = Encoding.UTF8.GetString(buffer, 0, buffer.Length); ShowMsg(socketSend.RemoteEndPoint + ":" + str); //byte[] buffer = new byte[1024 * 1024]; //int r = socketSend.Receive(buffer); //if (r == 0) //{ // break; //} //string str = Encoding.UTF8.GetString(buffer, 0, r); //ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + str); } catch { } }
问题出在将字节转换成字符串的时候,用buffer.Length设置的长度,字符串不换行,而用读取到的实际长度r获取字符串是可以换行的,对这里有点疑惑,希望有人能解答一下,谢谢
不换行的时候,你输出buffer里的每个字符看看都是些什么
恩,我早上调试了下,发现用buffer长度的字符串用\0结束符补全字符串,字符串在\0处被认为结束了,\r\n就没有作用。但是这个字符我在winform试验确实是正确的,但是在控制台中,这个\0字符后面的内容又可以显示出来,这是什么情况?
在buffer里换行符也是一个字符对应的ascii吗,只是转成string字符串的时候编辑解析的时候解析成换行了
恩,你说的意思我能够理解。不过我的换行符是在转换成字符串后加的换行符,在showmsg方法里面。换行的原因我试过了,是因为用buffer长度的时候用\0补全了剩余的长度,用 r 长度的时候,字符长度刚好是写入的长度,所以不需要用\0补全。而在winfrom中,\0会被当做字符串结尾符,后面的不会显示了。但是我拿到控制台当中,\0只是被转换成一个空格字符,后面的内容还是可以打印出来