2011-02-09 85 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