字节数组到字符串的转换格式问题

时间:2019-05-30 15:36:35

标签: c#

我正在使用网络流从Windows窗体中的文本框传输数据,当读取此数据时,我将其写到控制台,而传输的数据输出正常,这似乎产生了我所不知道的空白无法识别为新行或大量空格。

我尝试使用Replace函数将空格''和换行'\ n'替换为空字符,但这似乎无法解决问题,并且读取的数据与后续数据之间仍然存在异常间隙它。

输出应显示: 约翰·多伊(John Doe)加入了

但是说: 约翰·杜(John Doe)
                                                                                                               已加入

TcpClient clientSocket = serverSocket.AcceptTcpClient();
byte[] bytesFrom = new byte[clientSocket.ReceiveBufferSize];
clientSocket.GetStream().Read(bytesFrom, 0, clientSocket.ReceiveBufferSize);
string dataFromClient = Encoding.ASCII.GetString(bytesFrom);
Console.WriteLine($"{dataFromClient} joined");

1 个答案:

答案 0 :(得分:1)

您的代码正在尝试对整个bytesFrom数组进行解码,无论它是否包含数据。 Stream.Read不会覆盖整个缓冲区,它只会覆盖所需的字节并返回字节数。

这意味着您第一次尝试对缓冲区进行解码时,还将尝试对它所包含的0进行解码。您可能会在 second 时间结束,对旧数据和新数据进行解码。

您应该将代码更改为:

byte[] bytesFrom = new byte[clientSocket.ReceiveBufferSize];
using(var stream=clientSocket.GetStream())
{
    var read=stream.Read(bytesFrom, 0, clientSocket.ReceiveBufferSize);
    var text = Encoding.ASCII.GetString(bytesFrom,0,read);
    Console.WriteLine("Actual Text: {0}",text);
}

另一个问题是Encoding.ASCII是7位的US-ASCII代码页。该代码页中未包含的任何字符都将丢失,并由?代替。 .NET字符串是Unicode(UTF16)。至少在服务器和客户端上至少使用UTF8编码,以避免丢失数据