0

C# Web サービスを使用していますが、パラメーターの 1 つが md5 ハッシュを送信しています。Java は符号付き (バイト配列に負の数を含む) で MD5 ハッシュを作成し、C# は符号なし (バイト配列に負の数を含まない) を生成します。

私は Stack Overflow で複数の同様の質問をしましたが、満足のいくものは見つかりませんでした。

必要なのは、c# が生成するものと同様の符号なしバイト配列だけです。BigInteger を使用してみましたが、その後さらに処理を行う必要があるため、符号なしバイト配列で使用する必要があります。BigInteger は 1 つの整数を提供し、tobytearray() を使用するとまだ負の数になります。

2 補数を行う必要がある場合、どうすればそれを行うことができますか。次に、バイト配列をループして、負の数を正の数に変換できます。

MD5 ハッシュを生成するために、次の Java コードを使用しています。

    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 bytes are signed numbers, but that only means that when considering a byte (which is a sequence of 8 bits) as a number, Java treats one of the bits as a sign bit, whereas other language read the same sequence of bits as an unsigned number, containing no sign bit.

The MD5 algorithm is a binary algorithm that transforms a sequence of bits (or bytes) into another sequence of bits (or bytes). The way Java does that is the same as the way any other language does it. It's only when displaying the bytes as numbers that you'll get different outputs depending on the way the language transforms bytes into numbers.

So the short answer is, send an MD5 hash generated using Java to a C# program, and it will work fine.

If you want to display the byte array in Java as unsigned numbers, just use the following code:

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