Кодировка UTF-16 в Java по сравнению с С#
Я пытаюсь прочитать схему кодировки String в UTF-16 и выполнять хеширование MD5 на ней. Но странно, Java и С# возвращают разные результаты, когда я пытаюсь это сделать.
Ниже приведен фрагмент кода в 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
Ниже приведен фрагмент кода в С#:
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
Я не уверен, почему выходы не совпадают. Как мы можем изменить вышеприведенный фрагмент кода, чтобы оба они возвращали один и тот же результат?
Ответы
Ответ 1
UTF-16!= UTF-16.
В Java getBytes("UTF-16")
возвращает представление с большим числом символов с необязательным знаком байтового байта. С# System.Text.Encoding.Unicode.GetBytes
возвращает малозначное представление. Я не могу проверить ваш код здесь, но я думаю, вам нужно точно указать преобразование.
Попробуйте getBytes("UTF-16LE")
в версии Java.
Ответ 2
Первое, что я могу найти, и это, возможно, не единственная проблема, заключается в том, что С# Encoding.Unicode.GetBytes() малочисленен, а порядок байтов Java - байдален.
Ответ 3
Вы можете использовать System.Text.Enconding.Unicode.GetString(byte[])
для преобразования обратно с байта в строку. Таким образом, вы уверены, что все происходит в кодировке Unicode.