我的数字从左到右为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);
虽然它有效但感觉非常低效。有没有更有效的方法呢?
答案 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到左边