【问题标题】:.Net unicode problem, vb6 legacy.Net unicode 问题,vb6 遗留问题
【发布时间】:2009-06-29 13:22:32
【问题描述】:

我在 VB6 中有一个解密例程。我现在想要在 C# 中进行相同的解密。 需要解密的字符串是 unicode,所以我使用 Encoding.Unicode.GetString 来读取 C# 中的输入。输入现在看起来与 VB6 中的完全相同。

循环中的前几个字符被解密 ok!然后我遇到了不同... 该程序使用与 VB6 不同的索引来解析字符 '~'。

调试时,我在 VB 和 .Net 中看到以下内容:
VB6 ~ = 代码 152
C# ~ = 代码 732

不用说,解密失败。我需要为上面提到的角色获得 152。

这里有什么问题?

问候,

米歇尔

【问题讨论】:

    标签: .net unicode vb6-migration codepages


    【解决方案1】:

    您的 VB6 没有读取 Unicode(我猜是 Windows-1252 代码页),这就是它返回不同字符代码的原因。

    【讨论】:

    • 谢谢你的回答,你是对的。实际上我忘了用 C# 中的代码页 1252 阅读解密种子。
    【解决方案2】:

    “字符 152”到底是什么意思?你是怎么得到这个号码的?

    请注意,“使用 Unicode”可能意味着许多不同的东西。您确定它在二进制数据中编码为 UTF-16 吗?如果您可以发布更多有关源数据的信息,那将非常有帮助。

    此外,加密和解密几乎总是应该使用字节而不是字符来完成。虽然我知道您需要重现遗留行为,但随着时间的推移,您应该尝试不再将字符串视为不透明的二进制数据。

    【讨论】:

    • 您当然是对的,但目前我无法说服我的老板创建一个理智的系统。 (我在 VB6 中调试得到 152)
    【解决方案3】:

    我以前做过。问题出在您的编码中。 .NET 是 unicode,VB6 是 Unifail。

    在 .NET 方面,您需要使用 Encoding.ASCII 将字符串转换为字节数组,反之亦然。

    Encoding.ASCII.GetString(decrypted);
    //and
    Encoding.ASCII.GetBytes(cleartext);
    

    因此,当您加密发送到 VB 应用程序时,您必须使用 ASCII.GetBytes 然后加密该字节数组,当您从 VB 端获取字节数组时,您必须解密它们并使用 ASCII.GetString 来将字节解码为可用的字符串。

    【讨论】:

    • 威尔,这确实是我解决方案的一部分。但是,我使用 Unicode 而不是 ASCII。我的密码和加密文本不是 base 64,甚至不是 ascii 128。