Почему моя кодировка добавляет \ 0 после декодирования? - PullRequest
0 голосов
/ 16 ноября 2018

Итак, я отправляю простую строку из моего TCP-клиента на мой сервер, а затем, когда я ее получаю, она декодирует байты и распечатывает полученные данные. Однако я отправляю

Client connecting..

и я получаю

Client connecting..\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0

Почему это так?Буфер, кажется, тот же, 18 байтов с пустыми, равными 0, это из-за метода кодирования?Я пробовал разные, такие как Default и UTF8, но, похоже, все еще делает то же самое.

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

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Согласно вашему коду

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);
0 голосов
/ 16 ноября 2018

\ 0 - это «пустое» значение для объекта char, поэтому, скорее всего, оно читает символы.

...