解码字符串c#

Decoding a string c#

我创建了分发客户端消息的 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);

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

一些建议阅读:

问题是 C# 中的一个字符表示一个 2 字节的 UTF-16 字符。西里尔字符在 UTF-16 中大于 255,因此在将其转换为字节时会丢失信息。

要将字符串转换为字节数组,请使用编码 class:

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

要在接收端将其转换回字符串,请写:

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

另一个问题是 Stream.Read 不能保证一次读取您消息的所有字节(您的流不知道您发送了特定大小的数据包)。所以可能会发生,例如,接收到的字节数组的最后一个字节只是一个 2 字节字符的第一个字节,而你在下次调用 Stream.Read.[=12= 时收到另一个字节]

这个问题有几种解决方案:

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