C# C中int和char之间的错误转换#

C# C中int和char之间的错误转换#,c#,char,int,xor,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 = (ch

也许我的问题很傻,但我在将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')。相反,当我使用encrypt XOR的char结果(这是我在DB中的结果)时,我得到了错误的结果(无法读取的字符)

我尝试使用不同的编码,但我不知道问题出在哪里

有什么建议吗

更新

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

解决

字符“†”位于Windows 1252代码页中。所以我得到了一个编码正确的字节[]

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

谢谢

“†”字符可以不是一个而是多个Unicode值的前字符

我可以创建一种字体,其中“a”不仅表示65 ASCII值,还表示任何值,或者我可以创建一种字体,其中所有字符都是“a”

比如在你的例子中,†可以是你说的134,也可以是Oded提到的8224


更多地强调ASCII/Unicode值,而不是转换为字符时该值的外观。

您的问题是
'†'
是8224,而不是134。(@Oded首先提到了这一点)您可以使用
'\u0086'
,它是134。

这不是cryptography@Jodrell-很显然,这只是一个凯撒移位。@Jodrell-我不需要强加密,我只需要从DB中解密该值。@777,反过来说,它会很快。你基本上已经做对了
chrVal==correct
因此您知道它是往返的,只需忽略
字节
134
的显示方式。是的,问题恰恰在于此。但是,(char)('M'^203)返回'†',但是(char)('†'^203)在您使用的字体中不返回'M',134(显然)看起来像8224,但代码中的
'†'
是8224,而不是134。如果改用
(char)('\u0086'^203)
(0x86==134),结果将是预期的“M”。我正在使用DataReader从数据库读取该值。使用Convert.ToChar(dr[“sex”])我得到了8224。我没有强调我所看到的,问题是“代码”所看到的也是错误的。使用Convert.ToChar(dr[“Sex”])从数据库中读取会得到8824个字符。