【问题标题】:Wrong converting between int and char and back in C#在 C# 中 int 和 char 之间的错误转换和返回
【发布时间】:2012-05-28 13:01:56
【问题描述】:

我的问题可能很愚蠢,但我在将 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 结果(这是我在数据库中拥有的)时,我得到了错误的结果(不可读的字符)。

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

有什么建议吗?

更新

我发现问题可能出在 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'

谢谢

【问题讨论】:

  • 这不是密码学
  • @Jodrell - 可以肯定的是,这只是凯撒式的转变。
  • @Jodrell - 我不需要强加密,我只需要从 DB 中解密该值。
  • @Flea777,从好的方面来说,它会很快。你基本上已经正确了。 chrVal == correct 所以你知道它是往返的,只需忽略 byte 134 的显示方式。

标签: c# char int xor


【解决方案1】:

'†' 字符可以是多个 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.

【讨论】:

  • 我没有强调我所看到的,问题是“代码”看到的也是错误的。使用 Convert.ToChar(dr["Sex"]) 从数据库读取得到 8824 个字符。
【解决方案2】:

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

【讨论】:

  • 是的,问题正是如此。但是,(char)('M' ^ 203) 返回 '†' 但 (char)('†' ^ 203) 不返回 'M'
  • 在您使用的字体中,134(显然)看起来像 8224,但您代码中的 '†' 是 8224,而不是 134。如果您使用 (char)('\u0086' ^ 203) (0x86 == 134)相反,结果是预期的“M”。
  • 我正在使用 DataReader 从数据库中读取该值。使用 Convert.ToChar(dr["sex"]) 我得到 8224。
猜你喜欢
  • 1970-01-01
  • 2011-06-29
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
  • 2018-10-26
相关资源
最近更新 更多