Java 在双变量中将大字节数组转换为自然数组

Java 在双变量中将大字节数组转换为自然数组,java,arrays,biginteger,Java,Arrays,Biginteger,我有一个大小为8(64位)的字节数组序列。我想将相应的自然数放入一个变量(基元类型),因此我想使用双变量,因为其他基元类型不支持这么高的范围(从0到2^64) 我举一个例子: 我有以下字节数组 000000 0000000 0000000 0000000 0000000 0000000 0000000 0000010 相应的自然数是2 我试过这个: double bigNaturalNum = new BigInteger(byteArray).doubleValue(); 问题是doubl

我有一个大小为8(64位)的字节数组序列。我想将相应的自然数放入一个变量(基元类型),因此我想使用双变量,因为其他基元类型不支持这么高的范围(从0到2^64)

我举一个例子:

我有以下字节数组

000000 0000000 0000000 0000000 0000000 0000000 0000000 0000010
相应的自然数是2

我试过这个:

double bigNaturalNum = new BigInteger(byteArray).doubleValue();

问题是doubleValue()方法返回字节表示的双精度值,因此结果值可以是十进制值。

这取决于
字节[]
中的最高有效位是否用作符号位,例如。如果是这样,您可以使用
ByteBuffer将
byte[]
映射到
long

byte[] arr = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff };
long l = ByteBuffer.wrap(arr).getLong();
System.out.println(l); // -1
System.out.println(Long.toHexString(l)); // ffffffffffffffff
如果不是,则应使用
biginger
signum=1
来表示不使用符号位:

byte[] arr = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff };
BigInteger i = new BigInteger(1, arr);
System.out.println(i); // 18446744073709551615

我终于解决了将值存储在
long
变量中的问题。Java没有无符号长原语类型,但从JavaSE 8中,可以通过long类的方法将long变量视为无符号长变量

例如,您可以使用方法
publicstaticintcompareunsigned(长x,长y)

以数字方式比较两个长值,并将这些值视为无符号


通过这种方式,您可以在一个长变量中存储2^64个自然数。

也许您想要
long
(64位整数),而不是
double
(双精度浮点)?好吧,您必须接受这样一个事实,即2^64不能由任何基元精确表示。这就是
biginger
的作用。当数字在
long
范围内时,是否需要
long
;当数字超出范围时,是否需要
double
?除其他注释外,
long
是64位有符号的。Java中没有合适的无符号原语(只有奇怪的16位
char
)。因此,您需要一个对象,或者将
long
视为它是无符号的,知道它是有符号的。如果我将数字存储在双变量中,并且该值是自然值,为什么我不能表示64位值?如果我将数字存储在双变量中,并且该值是自然值,为什么我不能表示64位值?。因为您无法将64位放入53位字段。看见