Проблемы с форматированием массива байтов в строку

Я использую сетевой поток для передачи данных из текстового поля в формах Windows, когда эти данные читаются, я записываю их в консоль, в то время как передаваемые данные выводятся нормально, кажется, создается странный пробел, которого я не был в состоянии идентифицировать как новую строку или как много пробелов.

Я попытался использовать функцию замены для замены пробелов ' ' и новых строк '\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");

Возможно, он отправляется с новой строкой (пара <CR><LF>) в конце?

Steve Todd 30.05.2019 17:38
Используйте свой отладчик, чтобы просмотреть содержимое dataFromClient.
Dour High Arch 30.05.2019 17:40

Вы пытались поставить ".TrimEnd('\n', '\r', ' ');" в конце вашего GetString()?

Steve Todd 30.05.2019 17:46

Новые строки не появляются сами по себе. Как вы Отправить строку? Возможно, вы используете WriteLine? Кстати, строки .NET имеют кодировку Unicode. Encoding.ASCII — это 7-битная кодировка US ASCII. Преобразовывая текст в US-ASCII, вы будете использовать терять для любых символов, которые не могут быть представлены в этой кодовой странице. Вместо этого используйте Encoding.UTF8 как для отправителя, так и для получателя.

Panagiotis Kanavos 30.05.2019 17:48

Подождите, вы не используете количество байтов вернулся, вы пытаетесь преобразовать весь буфер, независимо от того, содержит он данные или нет. ` new byte[clientSocket.ReceiveBufferSize]` создает массив, заполненный нулями, что означает, что Encoding.ASCII.GetString(bytesFrom); пытается декодировать 0, как если бы они были символами

Panagiotis Kanavos 30.05.2019 17:52

Все они теперь используют UTF8, это не решило проблему, но я рад, что теперь использую правильную кодировку, как мне получить возвращаемые числа байтов от клиента, а не всего буфера?

R. Watts 30.05.2019 17:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш код пытается декодировать весь массив bytesFrom, независимо от того, содержит он данные или нет. Stream.Read не перезаписывает весь буфер, он перезаписывает только те байты, которые ему нужны, и возвращает количество байтов.

Это означает, что при первой попытке декодировать буфер вы также будете пытаться декодировать содержащиеся в нем 0. Время второй может закончиться декодированием смешанных старых и новых данных.

Вы должны изменить свой код на:

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 как на сервере, так и на клиенте, чтобы избежать потери данных.

Другие вопросы по теме