我正在使用 C# Web 服务,参数之一是发送 md5 哈希值。 Java 创建带符号的 MD5 哈希(字节数组中包含负数),C# 生成无符号的 MD5 哈希(字节数组中不包含负数)。
我在 Stack Overflow 上浏览过多个类似的问题,但没有找到令我满意的问题。
我所需要的只是类似于 c# 生成的无符号字节数组。我尝试过使用 BigInteger,但我需要将其放在无符号字节数组中,因为之后我需要进行进一步处理。 BigInteger 给我一个整数,使用 tobytearray() 仍然有负数。
如果我必须做 2 补,那么我该怎么做。然后我可以循环遍历字节数组并将负数转换为正数。
我使用以下 Java 代码来生成 MD5 哈希值:
String text = "abc";
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] md5hash = new byte[32];
try {
md.update(text.getBytes("utf-8"), 0, text.length());
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
md5hash = md.digest();
最佳答案
Java 字节是有符号数字,但这仅意味着当将字节(即 8 位序列)视为数字时,Java 将其中一位视为符号位,而其他语言读取相同的序列位作为无符号数,不包含符号位。
MD5 算法是一种二进制算法,它将一个位(或字节)序列转换为另一个位(或字节)序列。 Java 的方式与任何其他语言的方式相同。仅当将字节显示为数字时,您才会得到不同的输出,具体取决于语言将字节转换为数字的方式。
所以简短的答案是,将使用 Java 生成的 MD5 哈希值发送到 C# 程序,它就会正常工作。
如果你想在Java中将字节数组显示为无符号数字,只需使用以下代码:
for (byte b : bytes) {
System.out.println(b & 0xFF);
}
关于java - 如何在Java中获取未签名的md5哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17512384/