0

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

1 回答 1

5

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

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

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

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

for (byte b : bytes) {
    System.out.println(b & 0xFF);
}
于 2013-07-07T13:12:18.687 回答