2011-02-09 42 views
0

我在磁盘上,我正在读这已被写入由C/C++代码的文件。我知道我有两个64位无符号整数要读取,但Java不支持无符号整数,所以当我执行DataInputStream.readLong()时得到的值不正确。 (现在忽略字节顺序我实际上使用DIS的衍生物,称为LEDataInputStream,我从网上下载)C/C++很长很长到Java长

很多帖子在这里讨论使用BigInteger,但javadoc阅读bytearray只谈论加载一个bytearray respresentation,并且这些问题似乎集中在这样一个事实上,即有些人超出了java long类型的正面界限,而我将远远没有看到我正在阅读的数据。

我有一个MATLAB /倍频脚本读取这些长长的值作为每两个32位整数,然后做一些乘法和增加得到它想要过答案。

我想的问题是 - 怎么办我读取的64位无符号整数或者使用的BigInteger,或者使用[LE] DataInputStream.XXX?

在此先感谢

回答

3

我会用ByteBuffer,然后使用代码,如this得到你想要什么建议。

+0

这看起来很有希望,但我需要实现的功能来读取long类型的自己(因为没有方法有读取一个unsigned long),并把它变成的BigInteger。我已经接受了这个作为官方的回答,因为它是最接近我想要的东西 – 2011-02-24 12:22:11

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(); 
1

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

编辑:一种常见的方法来处理无符号数是加宽的数据类型。这在许多情况下,简单的,但不是必需的(和使用BigInteger不使事情更简单恕我直言long

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 
+0

不幸的是,这并不能完全回答我的查询 - 我的数据已经在磁盘上,而不是我写的,所以我不能只是使用签名的java类型,因为当我从磁盘读取它的绝对值是错误的! – 2011-02-24 12:19:58