我使用以下代码从十六进制字符串创建BigInteger
并打印到输出。
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
我做错了什么?
答案 0 :(得分:17)
您传入的是一个字节数组,其中第一个字节的顶部位已设置 - 使其为负数。来自constructor documentation:
将包含BigInteger的二进制补码二进制表示的字节数组转换为BigInteger。假设输入数组采用big-endian字节顺序:最重要的字节位于第0个元素中。
具有前导设置位的二进制补码二进制表示为负。
要获得您想要的结果,您可以执行以下任何操作:
"00"
前缀十六进制字符串,以便始终获得0的顶部字节BigInteger(String, int)
构造函数,其中符号是从字符串开头是否存在"-"
推断出来的。 (显然你会以16分为基础。)BigInteger(int, byte[])
构造函数,将{作为signum
值如果您的真实上下文是您已经获得了字节数组,而您只是从十六进制字符串中解析它以进行测试,那么我将使用第三个选项。如果你真的有一个十六进制字符串作为输入,我会使用第二个选项。
答案 1 :(得分:4)
试
BigInteger bigInt = new BigInteger(HexString, 16);