2015-09-05 87 views
2

問題:Java與C#:BigInteger十六進制字符串會產生不同的結果嗎?

該代碼在Java中:

BigInteger mod = new BigInteger("86f71688cdd2612ca117d1f54bdae029", 16); 

產生(在Java)的數量

179399505810976971998364784462504058921 

然而,當我使用C#,

BigInteger mod = BigInteger.Parse("86f71688cdd2612ca117d1f54bdae029", System.Globalization.NumberStyles.HexNumber); // base 16 

我不沒有相同的號碼,我得到:

-160882861109961491465009822969264152535 

然而,當我直接從十進制創建的數量,它的工作原理

BigInteger mod = BigInteger.Parse("179399505810976971998364784462504058921"); 

我試圖轉換十六進制字符串字節數組和扭轉它,並創建一個從反向陣列的BigInteger,只是在情況下,它是一個字節數組不同字節,但沒有幫助...

轉換的Java代碼到C#的時候我也遇到了以下問題:
的Java

BigInteger k0 = new BigInteger(byte[]); 

獲得在C#中相同的號碼,我必須扭轉,因爲在BigInteger的實現不同字節數組

C#相當於:

BigInteger k0 = new BigInteger(byte[].Reverse().ToArray()); 
+2

嘗試在C#版本加入8前爲零。 – RealSkeptic

+1

@RealSkeptic應該是一個答案;爲我工作[這裏](http://ideone.com/w3Ee5H)。 – bcsb1001

回答

7

這裏的MSDN說怎麼樣BigInteger.Parse

如果值是一個十六進制字符串,則Parse(String, NumberStyles)方法將值解釋爲通過使用二進制補碼錶示形式存儲的負數,如果其前兩個十六進制數字s大於或等於0x80。換句話說,該方法將值中第一個字節的最高位解釋爲符號位。爲確保十六進制字符串被正確解釋爲正數,第一個數字的值必須爲零。例如,該方法將0x80解釋爲負值,但它將0x0800x0080解釋爲正值。

因此,在解析後的十六進制數前面加上0來強制進行未簽名的解釋。

至於在Java和C#之間往返一個由字節數組表示的大整數,我建議不要,除非你真的必須這樣做。但是,如果您修復了字節順序問題,那麼兩個實現都會發生以使用兼容的二進制補碼錶示法。

MSDN says

通過此方法返回的數組中的各個字節出現在小端順序。也就是說,該值的低位字節在高位字節之前。數組的第一個字節反映BigInteger值的前八位,第二個字節反映後面的八位,依此類推。

Java docs say

返回一個包含該BigInteger的二進制補碼錶示的字節數組。字節數組將位於big-endian字節順序:最重要的字節位於第零個元素中。

相關問題