Java 在双变量中将大字节数组转换为自然数组
我有一个大小为8(64位)的字节数组序列。我想将相应的自然数放入一个变量(基元类型),因此我想使用双变量,因为其他基元类型不支持这么高的范围(从0到2^64) 我举一个例子: 我有以下字节数组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
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位字段。看见