C# C中int和char之间的错误转换#
也许我的问题很傻,但我在将char值转换为int值并转换回来时遇到了麻烦 问题是我试图解密Access DB检索到的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 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个字符。