Ily*_*man 2 java arrays biginteger
我的数字从左到右为256,以字节数组表示.我想将它们转换为BigInteger,以便下面的例子可以工作:
我想出了这个解决方案:
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)
虽然它有效但感觉非常低效.有更有效的方法吗?
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)