在int和char之间转换错误并返回C#

时间:2012-05-28 13:01:57

标签: c# char int xor

可能我的是一个愚蠢的问题,但我遇到了将char值转换为int并转换回来的麻烦。

问题在于我正在尝试解密由Access DB检索的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')。相反,当我使用加密XOR的char结果(这就是我在DB中所拥有的)时,我得到了错误的结果(不可读的字符)。

我尝试使用不同的编码,但我无法弄清楚问题出在哪里。

有什么建议吗?

更新

我发现可能问题出在ADO.NET OleDbDataReader上,因为(int)Convert.ToChar(dr [“Sex”])给了我8224而不是134,但我找不到解决方案。

解决

字符'†'位于Windows 1252代码页中。所以我得到一个带有正确编码的byte []。

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

由于

2 个答案:

答案 0 :(得分:3)

'†'字符可以是前面的字符,不是一个而是多个Unicode值。

我可以创建一个字体,其中'A'不仅仅是65个ASCII值,而是任何值,或者我可以创建一个所有字符都是'A'的字体。

就像你的情况一样,'†'可以是134,如你所说,8224就像Oded所提到的那样。

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

答案 1 :(得分:1)

你的问题是'†'是8224,而不是134.(@Oded首先提到这一点)你可以改用'\u0086',即134。