2011-01-05 106 views
1

我剛剛試圖爲我們公司編寫一個小型加密DLL(我第一次必須做這樣的事情)時遇到了一個問題。.Net編碼命名空間的問題?

如果我使用下面的代碼從字符串中獲取byte [](在我的情況下是英鎊符號£),然後使用.Net Framework的相同區域來獲取char [] byte []我得到一個問號而不是預期的£!

任何人都可以解釋爲什麼這是?

byte [] asciiBytes = Encoding.ASCII.GetBytes(「£」); Console.WriteLine(Encoding.ASCII.GetChars(asciiBytes).ToString());

+1

GetChars返回char []對不對? char []。ToString()甚至做任何明智的事情嗎? 'new string(char [])'看起來更可能,或者GetString ...? – 2011-01-05 17:20:57

+0

關於您的問題標題的注意事項:編碼是一個類,而不是一個名稱空間。 – 2011-01-05 17:24:29

+0

我曾經有一個史前的英國設計,有一個字符ROM和鍵盤用£代替$。該公司沒有持續足夠長的時間來設定任何標準。 – 2011-01-05 18:26:33

回答

3

您正在嘗試使用ASCII編碼,但井號不是ASCII。編碼不能處理字符,所以它使用「?」的編碼形式作爲某種事情的錯誤指標。

我建議你改用UTF-8。所有Unicode字符都可以用UTF-8表示,並且對於真正的ASCII字符串(這很常見)非常有效。

有一點需要注意:加密通常適用於任意二進制數據,並且結果是任意的二進制數據。 不要嘗試使用類似Encoding.UTF8.GetString(bytes)的方式將加密結果轉換回字符串 - 這將導致數據丟失,因爲任意二進制數據幾乎肯定不會是有效的UTF-8編碼字符序列。如果您需要字符串結果,請使用base64編碼:Convert.ToBase64String(bytes)