私はPythonで次のコードを持っています:
myBytes = m.digest()
for one in myBytes:
print(one, end=' ')
print(end='\n')
intlist = int.from_bytes(myBytes, 'little')
print("intlist", intlist)
上記のコードは次の結果を出力します
72230166 56 69 98 5189 49 43129 54237 2147230
intlist 306485766027497339553611008967975560776
今、私はJavaでまったく同じ結果を達成したいと思います。これはこれまでの私のコードです:
byte[] myBytes = md.digest();
System.out.println(Arrays.toString(myBytes));
BigInteger intlist = new BigInteger(myBytes);
System.out.println("intlist=" + intlist);
これから得られる結果は次のとおりです。
[72、-26、-90、56、69、98、5、-67、49、43、-127、54、-19、2、-109、-26]
intlist = 96902015312221227689534558263304164326
Javaでの結果は、私がやりたいことに対して間違っています。Pythonコードとまったく同じ値を取得したい。
何か案は?
Pythonでリトルエンディアンのバイト順序を指定しました。
intlist = int.from_bytes(myBytes, 'little')
ただし、JavaBigInteger(byte[] val)
コンストラクターはビッグエンディアンの順序で入力を受け取ります。また、int.from_bytes
デフォルトでは、入力が符号なし整数を表すと想定し、入力をBigInteger(byte[] val)
2の補数の符号付き整数として解釈します。
Pythonの結果をJavaで複製する場合は、配列の順序を逆にし、符号/大きさBigInteger(int signum, byte[] magnitude)
コンストラクターを使用して、配列を正の数を表すものとして扱います。
byte[] bytes = {72, -26, -90, 56, 69, 98, 5, -67, 49, 43, -127, 54, -19, 2, -109, -26};
for (int i = 0; i < bytes.length / 2; i++) {
byte temp = bytes[i];
bytes[i] = bytes[bytes.length - i - 1];
bytes[bytes.length - i - 1] = temp;
}
System.out.println(new BigInteger(1, bytes));
出力:
306485766027497339553611008967975560776
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加