2017-11-22 3 views
1

C#でユニコード文字列と一緒にいくつかのバイト配列を処理するときに奇妙な問題が発生しました。以下は私のコードです。Unicode.GetString in C#

var bytes = new byte[] {128, 216}; 
var strstr = Encoding.Unicode.GetString(bytes); 
var newBytes = Encoding.Unicode.GetBytes(strstr); 

Console.WriteLine(BitConverter.ToString(bytes)); 
Console.WriteLine(BitConverter.ToString(newBytes)); 

かなり簡単ですか?しかし、newBytesはバイトと同じではなく、私に衝撃を与えました。私の意見では、GetStringとGetBytesは逆の操作でなければなりません。誰でも私にこれが起こることを知らせてもらえますか?

出力

80-D8

FD-FF予め

おかげです。

+2

[関連](https://stackoverflow.com/a/12801261/21567) –

+0

@ Christian.K大変感謝しています。 –

答えて

3

私の意見では、GetStringとGetBytesは逆の操作でなければなりません。

これは、データが有効な文字列を表す場合です。しかし、0x80 0xD8をリトルエンディアンのUTF-16文字列としてデコードしようとしましたが、これは有効な文字列のバイナリ表現ではありません。 代理人の後に代理人がないため、無効です。

したがって、Encoding.GetStringは、復号時に無効なデータが検出された場合に使用される「置換文字」であるU+FFFDとしてバイナリデータをデコードします。

+1

あなたの説明のためにありがとう、ちょっと深いC#の偉大な作者ですか?あなたの助けを得ることは私の名誉です!再度、感謝します。 –

+1

@ Rang-jiHu:私は深度のC#の著者ですが、私は "偉大な"部分を主張しません:) –

+0

LOL、あなたはとても謙虚です、とにかく、ありがとう! –