2012-05-28 55 views
2

可能我的是一個愚蠢的問題,但我有問題轉換爲一個int值並轉換回一個char值。int和char之間的轉換錯誤,並返回在C#

問題是,我試圖解密由Access數據庫檢索到的char值。

這裏是我的代碼

char chrVal = 'M'; 
int intVal = (int)chrVal; // Output 77 'M' 
// Now trying to encrypt using XOR 
int encIntVal = intVal^203; // Output 134 '†' 
// Convert back 
char correct = (char)(encIntVal^203); // Output 'M' - CORRECT 
char wrong = (char)('†'^203); // Output WRONG value 

的事實是,當我使用所得到的來自XOR加密值INT,我得到正確的結果(「M」)。相反,當我使用加密異或(這是我在數據庫中)的char結果時,我得到錯誤的結果(不可讀的字符)。

我試圖使用不同的編碼,但我不知道問題出在哪裏。

有什麼建議嗎?

UPDATE

我發現,很可能問題是與ADO.NET OleDbDataReader,因爲(INT)Convert.ToChar(VDR [ 「性」])給了我8224,而不是134,但我無法找到一個解決方案呢。

解決

字符 '†' 是在Windows 1252代碼頁。所以我用正確的編碼得到一個byte []。

byte[] byteVal = Encoding.GetEncoding(1252).GetBytes(dr["Sex"]) 
char correct = (char)(byteVal[0]^203); // Output 'M' 

感謝

+1

'(INT) '†' == 8224 '。 – Oded

+0

這不是密碼術 – Jodrell

+0

@Jodrell - 它當然是,它只是一個凱撒輪班。 – Jamiec

回答

3

'†' 字符可以是前面字符不是一個而是許多Unicode值。

我可以創建一個字體,其中'A'不僅僅是用於65個ASCII值,而是任何值,或者我可以創建一個字體爲'A'的字體。

就像你的情況一樣,'†'可以像你說的那樣是134,而Oded可以是8224。

Give more emphasis on ASCII/Unicode values and not on what that value when converted to character looks like.

+0

我並不強調我所看到的,問題在於「代碼」所看到的是錯誤的。用Convert.ToChar(dr [「Sex」])從數據庫中讀取該字符給出8824個字符。 – Flea777

1

您的問題是'†'是8224,而不是134(@Oded提到這首),您可以使用'\u0086'代替,這是134

+0

是的,問題就是這樣。但是,(char)('M'^ 203)返回'†',但是(char)('†'^ 203)不返回'M' – Flea777

+0

在您使用的字體中,134(顯然)看起來像8224,但代碼中的''†'是8224,而不是134.如果使用'(char)('\ u0086'^ 203)'(0x86 == 134),結果是預期的'M'。 –

+0

我正在用DataReader從數據庫讀取該值。使用Convert.ToChar(博士[「性別」])我獲得8224。 – Flea777