2016-04-15 39 views
2

我在python以下代碼:轉換字節整數中的Java VS的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默認爲Big Endian – Cyb3rFly3r

回答

3

你指定little-endian字節順序的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 
+0

謝謝!那正是我需要的 – ThanosFisherman