1

我有以下代码,从旧的 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”来自哪里?

4

2 回答 2

2

这就是 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];
}
于 2013-01-07T18:35:01.017 回答
0

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

然后您可以使用UTF8.GetString(Byte[])方法对其进行解码。

于 2013-01-07T18:39:49.010 回答