Java和Python中如何将字节转换为整数

5

我在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代码完全相同的值,但是Java的结果是错误的。
你有什么想法吗?

你检查过字节顺序了吗?Java默认是大端字节序。 - Cyb3rFly3r
1个回答

4

您在Python中指定了小端字节顺序:

intlist = int.from_bytes(myBytes, 'little')

但是Java的BigInteger(byte[] val)构造函数接受大端顺序的输入。此外,int.from_bytes默认假定输入表示无符号整数,而BigInteger(byte[] val)将其输入解释为二进制补码有符号整数。

如果您想在Java中复制Python的结果,请反转数组的顺序并使用符号/大小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

谢谢!那正是我所需要的。 - ThanosFisherman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接