Encoding.UTF8.GetBytes似乎插入了一个伪字节

本文关键字:一个 字节 GetBytes UTF8 插入 Encoding | 更新日期: 2023-09-27 17:50:52

我有以下代码,从旧的VB6程序转换为c#。VB6使用了旧的Winsock,它可以接受字符串参数,但是c#程序使用System.Net.Socket which想要一个byte数组。

byte[] msg = Encoding.UTF8.GetBytes(tempString); 
_TCPConn.Send(msg);

tempString

0x0002 (' ')
0x0000 (''0')
0x0000 (''0')
0x0000 (''0')
0x0080 (' ')
0x006d ('m')
0x0068 ('h') 

但是msg得到一个额外的字节

0x02 
0x00
0x00
0x00
**0xc2**
0x80
0x6d
0x68

"c2"是从哪里来的?

Encoding.UTF8.GetBytes似乎插入了一个伪字节

这就是UTF8所做的。从0x80到0x7FF的值用2字节编码。从0x800到0xFFFF的值用3字节编码。0xC2 0x80告诉解码器只输出0x80。

编辑:如果接收者只期望每个字符的低字节和字符值0x80-0xFF是有效的,您将不得不一次转换每个字符一个。

int len = tempString.Length;
byte[] msg = new byte[len];
for ( int idx = 0; idx < len; ++idx )
{
  msg[idx] = (byte) tempString[idx];
}

这是由UTF8编码本身完成的。

那么你可以使用UTF8.GetString(Byte[])方法来解码