1

古いVB6プログラムからC#に変換された次のコードがあります。System.Net.Socket whichVB6 は文字列引数を受け入れる古いWinsockを使用していましたが、C# プログラムでは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 が有効である場合、各文字を一度に 1 つずつ変換する必要があります。

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 に答える