java - 如何读取未签名的 Java long 并将其值存储在 BigInteger 中?

标签 java types

我必须以某种方式在 Java 中处理 8 字节无符号整数类型。

我的 8 字节无符号整数存储在由 ByteBuffer 包装的字节数组中。它来自数据记录器数据库,包含非常大的数字。

这就是我处理 4 字节整数以将它们读取为无符号整数的方式:

((long) (bytebuffer.getInt() & 0xFFFFFFFFL));

不幸的是:

((BigInteger) (bytebuffer.getLong() & 0xFFFFFFFFFFFFFFFFL));

不起作用。

如何存储数字 2^64-1 并将其读取为 2^64-1

最佳答案

在 Java 中签名 long s,最高有效位的值是 -(263)。如果它是无符号的,那么该位的值为正 263。相差 264

首先,创建一个 BigInteger使用 long值(value)。然后,如果它是负数,则通过添加 2641 << 64 来应用无符号校正, 至 BigInteger .

BigInteger result = BigInteger.valueOf(bytebuffer.getLong());
if (result.compareTo(BigInteger.ZERO) < 0) {
    result = result.add(BigInteger.ONE.shiftLeft(64));
}

关于java - 如何读取未签名的 Java long 并将其值存储在 BigInteger 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51218584/

相关文章:

java - 从动态模型生成 View

typescript - 如何生成元组类型的映射类型?

java - 将字符串数组转换为 double 组

java - 使用套接字远程连接两台非本地计算机

java - 抽象工厂作为一种策略?

c++ - 错误 : Conversion from 'double' to non-scalar type 'Player' requested in function 'int main()' ;

function - fmap fmap如何应用于函数(作为参数)?

java - Elasticsearch - 如果字段具有相同的名称但有多个映射怎么办

c - 64位变量存储为32位

python - 由于导入机制导致 isinstance() 和 type() 等价失败(python/django)