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

C# 字节数组到字符串的转换格式问题,c#,C#,我使用网络流从windows窗体中的文本框传输数据,当读取这些数据时,我将其写入控制台,当传输的数据输出良好时,似乎产生了一个奇怪的间隙,我无法识别为新行或大量空格 我已尝试使用Replace函数用空字符替换空格“”和新行“\n”,但这似乎没有解决问题,而且读取的数据与其后的数据之间仍然存在异常间隙 输出应该是: 约翰·多伊也加入了 TcpClient clientSocket = serverSocket.AcceptTcpClient(); byte[] bytesFrom = new by

我使用网络流从windows窗体中的文本框传输数据,当读取这些数据时,我将其写入控制台,当传输的数据输出良好时,似乎产生了一个奇怪的间隙,我无法识别为新行或大量空格

我已尝试使用Replace函数用空字符替换空格“”和新行“\n”,但这似乎没有解决问题,而且读取的数据与其后的数据之间仍然存在异常间隙

输出应该是: 约翰·多伊也加入了

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");
而是说: 无名氏
加入

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");

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

这意味着第一次尝试解码缓冲区时,您也将尝试解码它包含的
0
s。第二次,您可能会对新旧数据进行混合解码

您应该将代码更改为:

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);
}

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

是否在发送数据时在末尾使用了新行(对)?要查看
dataFromClient
的内容,是否尝试在GetString()的末尾添加“.TrimEnd('\n','\r','');”?换行符本身不会出现。如何发送字符串?您可能正在使用
WriteLine
吗?顺便说一句.NET字符串是Unicode<代码>编码。ASCII
是7位美国ASCII编码。通过将文本转换为US-ASCII,您将丢失该代码页中无法表示的任何字符。使用
Encoding.UTF8
相反,在发送方和接收方等待时,您没有使用返回的字节数,而是尝试转换整个缓冲区,无论它是否包含数据新建字节[clientSocket.ReceiveBufferSize]`创建一个填充0的数组,这意味着
Encoding.ASCII.GetString(bytesFrom)尝试将0解码为字符