我正在使用c #Web服务,其中一个参数是发送md5哈希。 Java使用signed创建MD5哈希(在字节数组中包含负数),C#生成无符号(在字节数组中不包含负数)。
我在stackoverflow中经历了多个类似的问题,但没有找到任何让我满意的。
我需要的是无符号字节数组,类似于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();
答案 0 :(得分:5)
Java字节是带符号的数字,但这仅仅意味着当将一个字节(8位序列)视为数字时,Java会将其中一个位视为符号位,而其他语言则读取相同的序列位作为无符号数,不包含符号位。
MD5算法是一种二进制算法,它将比特(或字节)序列转换为另一个比特(或字节)序列。 Java的方式与任何其他语言的方式相同。只有当字节显示为数字时,才会获得不同的输出,具体取决于语言将字节转换为数字的方式。
所以简短的回答是,将使用Java生成的MD5哈希发送到C#程序,它将正常工作。
如果要将Java中的字节数组显示为无符号数,请使用以下代码:
for (byte b : bytes) {
System.out.println(b & 0xFF);
}