解码字符串C#

时间:2018-10-27 12:58:17

标签: c# .net tcp tcpclient

我创建了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 :(得分:2)

问题在于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不能保证一次读取消息的所有字节(您的流不知道您发送的是一定大小的数据包)。这样就可能发生,例如,接收到的字节数组的最后一个字节只是2字节字符的第一个字节,而下次调用Stream.Read时又收到另一个字节。

对此问题有几种解决方案:

  1. 在发送者端的StreamWriter中包装流,在接收者端的StreamReader中包装流。如果仅传输文本,这可能是最简单的方法。
  2. 在消息开头以整数形式发送消息的长度。这个数字告诉接收者他必须读取多少字节。

答案 1 :(得分:0)

要将字符串转换为字节,请使用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);

一些建议阅读: