2017-07-31 65 views
4

可能我錯過了一些東西,但我不明白爲什麼Encoding.UTF8.GetString和Encoding.UTF8.GetBytes不能作爲彼此的逆向變換工作?Encoding.UTF8.GetString和Encoding.UTF8.GetBytes是不是相互顛倒的原因是什麼?

在以下示例中myOriginalBytes和asBytes不相等,即使它們的長度也不相同。任何人都可以解釋我錯過了什麼?

byte[] myOriginalBytes = GetRandomByteArray(); 
var asString = Encoding.UTF8.GetString(myOriginalBytes); 
var asBytes = Encoding.UTF8.GetBytes(asString); 

回答

12

他們是逆如果你以一個有效的UTF-8字節序列,但他們沒有,如果你只是用任意字節序列開始。

我們來看一個具體而又非常簡單的例子:單字節0xff。這不是對任何文本的有效UTF-8編碼。所以,如果您有:

byte[] bytes = { 0xff }; 
string text = Encoding.UTF8.GetString(bytes); 

...你會text是單個字符,U+FFFD,它是用來表示有二進制數據解碼錯誤「Unicode替換字符」結束。您將以的任何無效序列結束替換字符 - 因此,如果以0x80開頭,您將得到相同的文本。顯然,如果多個二進制輸入被解碼爲相同的文本輸出,則它不可能是完全可逆的變換。

如果你有任意的二進制數據,你應該使用Encoding從它那裏得到的文本 - 你應該使用Convert.ToBase64String也許十六進制。 Encoding適用於自然文本的數據。

如果向相反的方向走,像這樣:

string text = GetRandomText(); 
byte[] bytes = Encoding.UTF8.GetBytes(text); 
string text2 = Encoding.UTF8.GetString(bytes); 

...我預計text2等於text與奇數的情況例外,你有無效文本首先,例如與「一半」代理對。

+0

我重新回顧了我的舊問題,我不得不說這是一個很好的答案(對於一個有趣的問題),thx再次。 –

相關問題