1

我在磁盘上有一个文件,我正在读取它是由 c/c++ 代码编写的。我知道我有两个 64 位无符号整数要读取,但 Java 不支持无符号整数,所以当我执行 DataInputStream.readLong() 时得到的值不正确。(暂时忽略字节顺序,我实际上使用的是从网上下载的名为 LEDDataInputStream 的 DIS 派生产品)

这里的很多帖子都在谈论使用 BigInteger,但用于读取 bytearray 的 javadoc 只谈论加载 bytearray 表示,问题似乎集中在这样一个事实,即有些人超出了 java long 类型的正边界,我与我正在阅读的数据相去甚远。

我有一个 MATLab/Octave 脚本,它将这些 long long 值分别读取为两个 32 位整数,然后进行一些乘法和加法以获得它想要的答案。

我想问题是 - 我如何使用 BigInteger 或使用 [LE]DataInputStream.XXX 读取 64 位无符号整数?

提前致谢

4

3 回答 3

3

我建议使用ByteBuffer然后使用这样的代码获得你想要的。

于 2011-02-09T12:35:09.107 回答
1

您可以使用 along作为 64 位值来存储无符号数据。这是一个模块,显示大多数无符号操作都可以使用标准long类型执行。这真的取决于你想用这个值做什么,这是否是问题。

编辑:处理无符号数的一种常用方法是扩大数据类型。这在许多情况下更简单但不是必需的(并且long使用BigInteger不会让事情变得更简单恕我直言)

EDIT2:以下代码有什么问题?

long max_unsigned = 0xFFFFFFFFFFFFFFFFl;
long min_unsigned = 0;
System.out.println(Unsigned.asString(max_unsigned) + " > "
        + Unsigned.asString(min_unsigned) + " is "
        + Unsigned.gt(max_unsigned, min_unsigned));

印刷

18446744073709551615 > 0 is true
于 2011-02-09T12:46:00.547 回答
0

首先你看看这个问题

也看到这个

现在使用 BigInteger 类

// Get a byte array
byte[] bytes = new byte[]{(byte)0x12, (byte)0x0F, (byte)0xF0};

// Create a BigInteger using the byte array
BigInteger bi = new BigInteger(bytes);

// Format to binary
String s = bi.toString(2);      // 100100000111111110000

// Format to octal
s = bi.toString(8);             // 4407760

// Format to decimal
s = bi.toString();              // 1183728

// Format to hexadecimal
s = bi.toString(16);            // 120ff0
if (s.length() % 2 != 0) {
    // Pad with 0
    s = "0"+s;
}


// Parse binary string
bi = new BigInteger("100100000111111110000", 2);

// Parse octal string
bi = new BigInteger("4407760", 8);

// Parse decimal string
bi = new BigInteger("1183728");

// Parse hexadecimal string
bi = new BigInteger("120ff0", 16);

// Get byte array
bytes = bi.toByteArray();
于 2011-02-09T12:37:32.250 回答