将大字节数组转换为双精度变量中的自然数组



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

我举一个例子:

我有以下字节数组

000000 0000000 0000000 0000000 0000000 0000000 0000000 0000010

对应的自然数是2。

我试过这个:

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

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

这取决于byte[]中最高有效位是否用作符号位,例如 2 的补码。如果是这样,您可以使用ByteBufferbyte[]映射到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

如果不是,则应将BigIntegersignum=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 - JavaSE 8 的方法将 long 变量视为无符号长变量。

例如,您可以使用该方法public static int compareUnsigned(long x, long y)

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

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

最新更新