C / C ++长期以来Java长

时间:2011-02-09 12:25:07

标签: java biginteger uint64

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

这里有很多帖子谈论使用BigInteger,但是用于读取bytearray的javadoc只讨论加载一个bytearray表示,而问题似乎集中在一些人超出java long类型的正边界的事实上,我将无法接近我正在阅读的数据。

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

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

提前致谢

3 个答案:

答案 0 :(得分:3)

我建议您使用ByteBuffer,然后使用this之类的代码来获取您想要的内容。

答案 1 :(得分:1)

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

编辑:处理无符号数的常用方法是扩大数据类型。在许多情况下这更简单但不是必需的(对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

答案 2 :(得分:0)

首先查看this question

另见this

现在使用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();