2013-10-18 61 views
1

將字節數組轉換爲字符串然後將字符串轉換回字節數組時,會出現奇怪的結果。將字節數組轉換爲字符串時出現奇怪的結果

試試這個:

 byte[] b = new byte[1]; 
    b[0] = 172; 
    string s = Encoding.ASCII.GetString(b); 

    byte[] b2 = Encoding.ASCII.GetBytes(s); 
    MessageBox.Show(b2[0].ToString()); 

對我來說結果不是172,我期望,但... 63.

它爲什麼會發生?

+0

172不是定義的ASCII字符。你得到了什麼? (63)' –

+1

顯然你的例子是一個人爲的案例。你試圖解決什麼是真正的問題? –

回答

5

爲什麼會發生?

由於ASCII僅包含值高達127

當遇到這對於給定的編碼無效的二進制數據,Encoding.GetString可以提供一個替換字符,或拋出異常。在這裏,它使用替代字符?

目前尚不清楚你想要達到什麼,但:

  • 如果你將任意的二進制數據,文本,使用Convert.ToBase64String代替;做不是嘗試使用編碼,因爲你並不真正代表文本。您可以使用Convert.FromBase64String進行解碼。
  • 通常是一個不錯的選擇,當然二進制數據包括172字節是 ASCII文本
  • 你需要找出哪些編碼你實際上使用。我個人不喜歡使用Encoding.Default,除非你真的知道數據是你正在工作的平臺的默認編碼。如果你有選擇,使用UTF-8是一個不錯的選擇。
3

ASCII編碼是一種7位編碼。如果你看看生成的字符串,它包含「?」 - 無法識別的字符。相反,您可以選擇Encoding.Default。

+3

如果OP正在嘗試對任意二進制數據進行編碼,然後再次對其進行解碼,他根本不應該使用編碼。建議Encoding.Default是一個壞主意,海事組織。 –

+0

我同意。此外,使用字符串來包含二進制數據是一個壞主意。 –

+0

試着對它進行編碼*就像那樣*是一個壞主意。使用base64效率不高,但如果你只有一個文本形狀的管道,並且你想傳輸二進制數據,那麼至少可以安全地使用它。 –

1

ASCII是一個七位字符編碼,因此172不在該範圍內,所以當轉換爲字符串時,它會轉換爲「?」用於無法表示的字符。

相關問題