为什么我的编码在解码后添加 \0?

Why does my encoding add \0 efter decoding?

所以我从我的 TCP 客户端向我的服务器发送一个简单的字符串,然后当我收到它时它解码字节并打印出它得到的内容..但是我正在发送

Client connecting..

我收到了

Client connecting..[=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=]

这是为什么? 缓冲区似乎是一样的,18个字节,空的为0 这是由于编码方法吗?我尝试了不同的方法,例如 DefaultUTF8,但它似乎仍然在做同样的事情。

    _listener.Start();
    Console.WriteLine("Waiting for connection..");

    //Assign our client the value of the first accepted request.
    _client = _listener.AcceptTcpClient();
    Console.WriteLine("Client connected.");

    //Set the stream to listen for incoming requests.
    _stream = _client.GetStream();

    //Build the package
    byte[] buffer = new byte[128];

    var bufferLength = _stream.Read(buffer, 0, buffer.Length);
    return buffer;

并将字节数组传递给这个

    public void SendPacket(byte[] buffer)
            {
                TcpClient client = new TcpClient(hostName, portNum);

                NetworkStream ns = client.GetStream();

                Console.ForegroundColor = ConsoleColor.Cyan;
                Console.WriteLine($"Received from remote client: {Encoding.UTF8.GetString(buffer, 0, buffer.Length)}");
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine($"Relaying to the remote server: {Encoding.UTF8.GetString(buffer, 0, buffer.Length)}");

                ns.Write(buffer, 0, buffer.Length);

        }

然后

Console.WriteLine("Data Received..");
var data = Encoding.UTF8.GetString(buffer, 0, length);
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("Received: " + data);

\0 是 char 对象的 "empty" 值,因此它很可能正在读取字符。

根据你的代码

var bufferLength = _stream.Read(buffer, 0, buffer.Length);
return buffer;

bufferLength掉在地上。

var data = Encoding.UTF8.GetString(buffer, 0, length);

我不知道 length 来自哪里,但我想这是缓冲区的长度。由于接收并没有填满整个缓冲区,而只是其中的一部分,因此您必须使用 bufferLength 来了解要处理的字节数。

同样的问题:

var eh = ns.Read(newBuffer, 0, newBuffer.Length);
var received = Encoding.ASCII.GetString(newBuffer, 0, newBuffer.Length);

使用eh!

var eh = ns.Read(newBuffer, 0, newBuffer.Length);
var received = Encoding.ASCII.GetString(newBuffer, 0, eh);