将字节数组转换为BigInteger

时间:2018-01-21 21:43:45

标签: 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);

虽然它有效但感觉非常低效。有没有更有效的方法呢?

2 个答案:

答案 0 :(得分:5)

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

  

将包含BigInteger的 two-s-complement 二进制表示的字节数组转换为BigInteger。假设输入数组在 big-endian 字节顺序中:最重要的字节在第0个元素中。

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

示例:[2, 20, 200] - &gt; [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);
}

测试

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

输出

5
200
256
612

答案 1 :(得分:2)

我知道你可以这样做:

import java.math.BigInteger;
import java.util.BitSet;

public class Main {
    public static void main(String[] argv) throws Exception {
        // A negative value
        byte[] bytes = new byte[] { (byte) 0xFF, 0x00, 0x00 }; // -65536
        // A positive value
        bytes = new byte[] { 0x1, 0x00, 0x00 }; // 65536
        BitSet set = BitSet.valueOf(bytes);
        set.flip(0, set.length());
        byte[] flipped = set.toByteArray();

        BigInteger bi = new BigInteger(flipped);
    }
}

我使用BitSet作为swat位因为你想要左边的但是BigInteger构造函数使用rigth到左边