2013-01-07 34 views
1

我有以下代码,从旧的VB6程序转换为C#。 VB6使用了旧的Winsock,它可以接受一个String参数,但是C#程序使用System.Net.Socket which想要一个byte数组。Encoding.UTF8.GetBytes似乎插入一个虚假的字节

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” 是从哪里来的?

+0

接收器期待什么? ANSI字符串或Unicode字符串? –

+0

VB6允许在字符串中存储字节,但那些日子已经结束。特别是Unicode规范化可以在您甚至将其转换回字节之前随机销毁内容。你需要在核心解决这个问题并停止使用字符串。 –

回答

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]; 
} 
+0

我已经使用了'Encoding.UTF8.GetBytes(“\ 0 \ 0 \ 0 mh”)'并打印了7个字节而没有'0xc2'。我错过了什么吗? –

+0

Yikes!那么我怎么才能将我的字符串转换为字节数组? – user316117

+0

* tempString *中的每个字符都保证为0x0000 - 0x00FF? –

相关问题