2016-04-15 3 views
2

У меня есть следующий код в Python:Преобразование байта в целое число в Java против Python

myBytes = m.digest() 
    for one in myBytes: 
     print(one, end=' ') 
    print(end='\n') 
    intlist = int.from_bytes(myBytes, 'little') 
    print("intlist", intlist) 

выше код печатает следующий результат

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.

Любые идеи?

+0

Вы проверили порядок байтов? Java - это большой Endian по умолчанию – Cyb3rFly3r

ответ

3

Вы указали обратный порядок байт в Python:

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

но конструктор Java BigInteger(byte[] val) принимает ввод в большой Endian порядка. Кроме того, int.from_bytes по умолчанию полагает, что вход представляет собой целое число без знака, а BigInteger(byte[] val) интерпретирует его вход как целое число со знаком с двумя символами.

Если вы хотите, чтобы повторить результат 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 
+0

Спасибо! Это было именно то, что мне нужно – ThanosFisherman

Смежные вопросы