2015-08-28 74 views
4

我使用以下代码从十六进制字符串创建BigInteger并打印输出。Java(BigInteger from byte array)

package javaapplication2; 

import java.math.BigInteger; 
import javax.xml.bind.DatatypeConverter; 

public class JavaApplication2 { 
    public static void main(String[] args) { 
     // Number in hexadecimal form 
     String HexString = "e04fd020ea3a6910a2d808002b30309d"; 
     // Convertation from string to byte array 
     byte[] ByteArray = toByteArray(HexString); 
     // Creation of BigInteger from byte array 
     BigInteger BigNumber = new BigInteger(ByteArray); 
     // Print result 
     System.out.print(BigNumber + "\n"); 
    } 
    public static String toHexString(byte[] array) { 
     return DatatypeConverter.printHexBinary(array); 
    } 

    public static byte[] toByteArray(String s) { 
     return DatatypeConverter.parseHexBinary(s); 
    } 
} 

这个代码,我得到了以下结果执行后:

-42120883064304190395265794005525319523

但我希望看到这样的结果:

298161483856634273068108813426242891933

我做错了吗?

回答

12

你传递一个字节数组,其中第一个字节时设置的最高位 - 使它负。从constructor documentation

将包含BigInteger的二进制补码二进制表示形式的字节数组转换为BigInteger。输入数组假定为big-endian字节顺序:最重要的字节位于第零个元素中。

具有前置位的二进制补码表示为负值。

为了得到你想要的结果,你可以做任何的:

  • 前缀的十六进制字符串与"00"让您总能获得的0
  • 顶字节穿的十六进制字符串直入BigInteger(String, int)构造函数,其中的符号是从字符串开始存在或不存在"-"推断出来的。 (很明显,你会在16传递为基础。)
  • 使用BigInteger(int, byte[])构造函数,传递1作为signum

如果您真正背景是,你已经得到的字节数组,而你只是为了测试目的而从十六进制字符串中解析它,我会使用第三个选项。如果你真的有一个十六进制字符串作为输入,我会使用第二个选项。

+0

谢谢!在你的回答之后,我解决了这个问题。 – Kechup

3

尝试

BigInteger bigInt = new BigInteger(HexString, 16); 
+0

非常有趣。我不知道这个构造函数的存在。做得好! –

+0

谢谢!我喜欢你的答案,将来会用到它。 – Kechup

+0

为什么有人低估了正确的答案?你真的不应该这样做。 – brso05