将字节数组转换为BigInteger

Ily*_*man 2 java arrays biginteger

我的数字从左到右为256,以字节数组表示.我想将它们转换为BigInteger,以便下面的例子可以工作:

  • [5] - > 5
  • [200] - > 200
  • [0,1] - > 256
  • [100,2] - > 612

我想出了这个解决方案:

    byte[] input = new byte[]{(byte) 200,2};
    BigInteger a = BigInteger.ZERO;
    BigInteger base = BigInteger.valueOf(256);
    for (int i = 0; i < input.length; i++) {
        a = a.add(BigInteger.valueOf(input[i] & 0xFF).multiply(base.pow(i)));
    }
    System.out.println(a);
Run Code Online (Sandbox Code Playgroud)

虽然它有效但感觉非常低效.有更有效的方法吗?

And*_*eas 5

BigInteger从字节数组创建a的最简单方法是使用new BigInteger?(byte[] val)构造函数:

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

由于您的输入数组是小端序,并且您不希望返回负数,因此需要反转字节并确保第一个字节为0-127,因此未设置符号位.最简单的方法是制作第一个字节0.

示例:[2, 20, 200]- >[0, 200, 20, 2]

这是代码:

private static BigInteger toBigInt(byte[] arr) {
    byte[] rev = new byte[arr.length + 1];
    for (int i = 0, j = arr.length; j > 0; i++, j--)
        rev[j] = arr[i];
    return new BigInteger(rev);
}
Run Code Online (Sandbox Code Playgroud)

测试

byte[][] data = { {5},
                  {(byte)200},
                  {0,1},
                  {100,2} };
for (byte[] arr : data)
    System.out.println(toBigInt(arr));
Run Code Online (Sandbox Code Playgroud)

产量

5
200
256
612
Run Code Online (Sandbox Code Playgroud)