2013-01-07 40 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? –

相關問題