【问题标题】:UTF-16 Encoding in Java versus C#Java 与 C# 中的 UTF-16 编码
【发布时间】:2011-01-25 12:19:44
【问题描述】:

我正在尝试以 UTF-16 编码方案读取字符串并对其执行 MD5 散列。但奇怪的是,当我尝试这样做时,Java 和 C# 会返回不同的结果。

以下是Java中的一段代码:

public static void main(String[] args) {
    String str = "preparar mantecado con coca cola";
    try {
        MessageDigest digest = MessageDigest.getInstance("MD5");
        digest.update(str.getBytes("UTF-16"));
        byte[] hash = digest.digest();
        String output = "";
        for(byte b: hash){
            output += Integer.toString( ( b & 0xff ) + 0x100, 16).substring( 1 );
        }
        System.out.println(output);
    } catch (Exception e) {

    }
}

输出是:249ece65145dca34ed310445758e5504

以下是C#中的一段代码:

   public static string GetMD5Hash()
        {
            string input = "preparar mantecado con coca cola";
            System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
            byte[] bs = System.Text.Encoding.Unicode.GetBytes(input);
            bs = x.ComputeHash(bs);
            System.Text.StringBuilder s = new System.Text.StringBuilder();
            foreach (byte b in bs)
            {
                s.Append(b.ToString("x2").ToLower());
            }
            string output= s.ToString();
            Console.WriteLine(output);
        }

输出是:c04d0f518ba2555977fa1ed7f93ae2b3

我不确定,为什么输出不一样。我们如何改变上面这段代码,让它们都返回相同的输出?

【问题讨论】:

  • 首先比较你的字节数组。如果它们甚至有一点不匹配,哈希值就会完全不同。 UTF-16 编码中可能有 BOM 或其他内容。它可能是小端或大端,或其他。

标签: c# java encoding md5 utf-16


【解决方案1】:

UTF-16 != UTF-16。

在 Java 中,getBytes("UTF-16") 返回一个带有可选字节顺序标记的大端表示。 C# 的 System.Text.Encoding.Unicode.GetBytes 返回一个小端表示。我无法从这里检查您的代码,但我认为您需要精确指定转换。

在 Java 版本中尝试getBytes("UTF-16LE")

【讨论】:

  • 值得注意的是,如果您查看 eclipse 中的输出,它仍然与 Visual Studio 显示的不匹配。但奇怪的是它确实有效......
  • 2015,基于波兰语的 Java 8.0 * .NET 4.0.x 测试,看起来就像 Yoy 写的一样。两种语言中的字节是相同的,并且具有 not BOM 前缀。测试的下一个重要领域:Java 算术静默接受溢出(适用于哈希),C# 默认不接受
【解决方案2】:

我能找到的第一件事,可能不是唯一的问题,是 C# 的 Encoding.Unicode.GetBytes() 是 littleendian,而 Java 的自然字节顺序是 bigendian。

【讨论】:

    【解决方案3】:

    您可以使用System.Text.Enconding.Unicode.GetString(byte[]) 将字节转换回字符串。通过这种方式,您可以确定一切都发生在 Unicode 编码中。

    【讨论】:

      猜你喜欢
      • 2016-03-14
      • 2011-08-18
      • 2012-03-13
      • 2023-03-06
      • 2012-01-07
      • 2017-01-20
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      相关资源
      最近更新 更多