可能我的是一个愚蠢的问题,但我遇到了将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'
由于
答案 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。