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

C# Encoding.UTF8.GetBytes似乎插入了一个伪字节,c#,.net,C#,.net,我有以下代码,从一个旧的VB6程序转换成C。VB6使用了旧的Winsock,它可以接受字符串参数,但C程序使用的是System.Net.Socket,它需要字节数组 byte[] msg = Encoding.UTF8.GetBytes(tempString); _TCPConn.Send(msg); tempString 0x0002 (' ') 0x0000 ('\0') 0x0000 ('\0') 0x0000 ('\0') 0x0080 (' ') 0x006d ('m') 0x00

我有以下代码,从一个旧的VB6程序转换成C。VB6使用了旧的Winsock,它可以接受字符串参数,但C程序使用的是
System.Net.Socket,它需要
字节
数组

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

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];
}
int len=tempString.Length;
字节[]msg=新字节[len];
对于(int-idx=0;idx
这是通过UTF8编码本身完成的。这很好


然后您可以使用方法对其进行解码。

我使用了
编码.UTF8.GetBytes(“\0\0\0 mh”)
并打印了7个字节,没有
0xc2
。我错过什么了吗?哎呀!那么我怎么能把我的字符串转换成字节数组呢?tempString中的每个字符都保证是0x0000-0x00FF吗?是的,保证-它所使用的设备是一台工业机械,也是由这家公司制造的,严格采用8位ASCII字符。我已经与管理层讨论了假设8位字符与删除所有旧的VB6逻辑并使其更加更新所需工作量的长期后果,他们对产品的这一部分保持8位表示满意。接收者期望什么?ANSI字符串或Unicode字符串?VB6允许在字符串中存储字节,但那些日子已经过去了。特别是Unicode规范化可以在您将内容转换回字节之前随机销毁内容。您需要从核心解决此问题,并停止使用字符串。