java如何获得无符号的md5哈希

时间:2013-07-07 13:02:33

标签: java md5

我正在使用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();  

1 个答案:

答案 0 :(得分:5)

Java字节是带符号的数字,但这仅仅意味着当将一个字节(8位序列)视为数字时,Java会将其中一个位视为符号位,而其他语言则读取相同的序列位作为无符号数,不包含符号位。

MD5算法是一种二进制算法,它将比特(或字节)序列转换为另一个比特(或字节)序列。 Java的方式与任何其他语言的方式相同。只有当字节显示为数字时,才会获得不同的输出,具体取决于语言将字节转换为数字的方式。

所以简短的回答是,将使用Java生成的MD5哈希发送到C#程序,它将正常工作。

如果要将Java中的字节数组显示为无符号数,请使用以下代码:

for (byte b : bytes) {
    System.out.println(b & 0xFF);
}