gpt4 book ai didi

c# - Java 与 C# 中的 UTF-16 编码

转载 作者:搜寻专家 更新时间:2023-10-30 21:14:19 24 4
gpt4 key购买 nike

我正在尝试读取 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 != UTF-16。

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

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

关于c# - Java 与 C# 中的 UTF-16 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4793387/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com