Java(来自字节数组的BigInteger)

时间:2015-08-28 14:32:45

标签: java biginteger

我使用以下代码从十六进制字符串创建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

我做错了什么?

2 个答案:

答案 0 :(得分:17)

您传入的是一个字节数组,其中第一个字节的顶部位已设置 - 使其为负数。来自constructor documentation

  

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

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

要获得您想要的结果,您可以执行以下任何操作:

  • 使用"00"前缀十六进制字符串,以便始终获得0的顶部字节
  • 将十六进制字符串直接传递到BigInteger(String, int)构造函数,其中符号是从字符串开头是否存在"-"推断出来的。 (显然你会以16分为基础。)
  • 使用BigInteger(int, byte[])构造函数,将{作为signum
  • 传递1

如果您的真实上下文是您已经获得了字节数组,而您只是从十六进制字符串中解析它以进行测试,那么我将使用第三个选项。如果你真的有一个十六进制字符串作为输入,我会使用第二个选项。

答案 1 :(得分:4)

BigInteger bigInt = new BigInteger(HexString, 16);