Расшифровка строки c # - PullRequest
       5

Расшифровка строки c #

0 голосов
/ 27 октября 2018

Я создал TCP-сервер, который распределяет сообщения клиента и работает на проблему.Когда я посылаю кириллические сообщения через поток, они не декодируются должным образом.Кто-нибудь знает, как я могу это исправить?

Вот код для отправки сообщения:

var message = Console.ReadLine().ToCharArray().Select(x => (byte)x).ToArray();
stream.Write(message);`

Вот код для получения:

var numberOfBytes = stream.Read(buffer,0,1024);
Console.WriteLine($"{numberOfBytes} bytes received");
var chars = buffer.Select(x=>(char)x).ToArray();
var message = new string(chars);

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Проблема в том, что символ в C # представляет 2-байтовый символ UTF-16. Символ кириллицы в UTF-16 больше 255, поэтому вы теряете информацию при преобразовании его в байт.

Чтобы преобразовать строку в байтовый массив, используйте класс Encoding:

byte[] buffer = System.Text.Encoding.UTF8.GetBytes(Console.ReadLine());

Чтобы преобразовать его обратно в строку на конце получателя, напишите:

string message = System.Text.Encoding.UTF8.GetString(buffer);

Другая проблема заключается в том, что Stream.Read не гарантирует одновременное чтение всех байтов вашего сообщения (ваш поток не знает, что вы отправляете пакеты определенного размера). Например, может случиться так, что последний байт полученного байтового массива будет только первым байтом двухбайтового символа, и вы получите другой байт при следующем вызове Stream.Read.

Существует несколько решений этой проблемы:

  1. Обернуть поток в StreamWriter на конце отправителя и в StreamReader на конце получателя. Вероятно, это самый простой способ, если вы передаете только текст.
  2. Передайте длину вашего сообщения в начале вашего сообщения в виде целого числа. Это число говорит получателю, сколько байтов он должен прочитать.
0 голосов
/ 27 октября 2018

Чтобы преобразовать строку в байты, используйте System.Text.Encoding.GetBytes(string).Я предлагаю вам изменить код отправки на:

// using System.Text;
var messageAsBytes = Encoding.UTF8.GetBytes(Console.ReadLine());

Чтобы преобразовать байты в строку, используйте System.Text.Encoding.GetString(byte[]).Если вы получаете байты в кодировке UTF-8:

// using System.Text;
var messageAsString = Encoding.UTF8.GetString(buffer);

Некоторые предлагают прочитать:

...