如何在Java中获取未签名md5哈希

如何在Java中获取未签名md5哈希,java,md5,Java,Md5,我使用的是C#web服务,其中一个参数是发送md5哈希。Java使用有符号(字节数组中包含负数)创建MD5哈希,C#生成无符号(字节数组中不包含负数) 我在Stack Overflow中遇到过多个类似的问题,但没有发现任何令我满意的问题 我所需要的只是类似于c#生成的无符号字节数组。我已经尝试过使用BigInteger,但我需要在无符号字节数组中使用它,因为我需要在这之后进行进一步的处理。BigInteger给了我一个整数,使用tobytearray()仍然有负数 如果我必须做2个补语,那我怎么

我使用的是C#web服务,其中一个参数是发送md5哈希。Java使用有符号(字节数组中包含负数)创建MD5哈希,C#生成无符号(字节数组中不包含负数)

我在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字节是有符号的数字,但这只意味着当将字节(8位序列)视为数字时,Java将其中一位视为符号位,而其他语言则将相同的位序列视为无符号数字,不包含符号位

MD5算法是一种二进制算法,它将一个位(或字节)序列转换为另一个位(或字节)序列。Java实现这一点的方式与任何其他语言都是一样的。只有当将字节显示为数字时,才能根据语言将字节转换为数字的方式获得不同的输出

因此,简单的回答是,将使用Java生成的MD5哈希发送到C#程序,它将正常工作

如果希望在Java中将字节数组显示为无符号数字,只需使用以下代码:

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

嗯,我不明白这怎么会是个问题。。。虽然Java确实使用无符号字节,但按位表示在任何情况下都是正确的…嗯,我不认为这会是一个问题。。。虽然Java确实使用无符号字节,但按位表示在任何情况下都是正确的。。。