在 Java 与 Python 中将字节转换为整数
Convert bytes to integer in Java vs Python
我在python中有以下代码:
myBytes = m.digest()
for one in myBytes:
print(one, end=' ')
print(end='\n')
intlist = int.from_bytes(myBytes, 'little')
print("intlist", intlist)
以上代码打印出如下结果
72 230 166 56 69 98 5 189 49 43 129 54 237 2 147 230
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')
但是 Java BigInteger(byte[] val)
构造函数以大端顺序接受输入。此外,int.from_bytes
默认假设输入表示无符号整数,而 BigInteger(byte[] val)
将其输入解释为二进制补码有符号整数。
如果要在 Java 中复制 Python 结果,请反转数组的顺序并使用 sign/magnitude 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
我在python中有以下代码:
myBytes = m.digest()
for one in myBytes:
print(one, end=' ')
print(end='\n')
intlist = int.from_bytes(myBytes, 'little')
print("intlist", intlist)
以上代码打印出如下结果
72 230 166 56 69 98 5 189 49 43 129 54 237 2 147 230
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')
但是 Java BigInteger(byte[] val)
构造函数以大端顺序接受输入。此外,int.from_bytes
默认假设输入表示无符号整数,而 BigInteger(byte[] val)
将其输入解释为二进制补码有符号整数。
如果要在 Java 中复制 Python 结果,请反转数组的顺序并使用 sign/magnitude 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