2011-05-20 53 views
10

我剛剛發現RandomAccessFile類中沒有readUnsignedInt()方法。爲什麼?有沒有解決方法從文件中讀取一個無符號整型數?爲什麼在RandomAccessFile類中沒有readUnsignedInt?

編輯:

我想從文件中讀取一個無符號整數,並把它變成一個長空間。

EDIT2:

不能使用readLong()。它將讀取8個字節而不是4個字節。該文件中的數據具有4字節範圍內的無符號整數。

EDIT3:

找到答案在這裏:http://www.petefreitag.com/item/183.cfm

Edit4:

怎麼樣,如果數據文件是little-endian的?我們需要先交換位?

+3

Java不支持無符號整數。 http://stackoverflow.com/questions/430346/why-doesnt-java-support-unsigned-ints – Swati 2011-05-20 20:43:04

+1

@Swati:好吧,他們可以用'readUnsignedShort()'讀取2個字節並返回一個int :讀取4個字節並返回一個長整型。 – musiKk 2011-05-20 20:46:03

+0

他們也可能剛剛實現了unsigned int,但你可以做什麼。 – Swati 2011-05-20 20:51:06

回答

19

我會做它是這樣的:

long l = file.readInt() & 0xFFFFFFFFL; 

位操作是必要的,因爲upcast會擴展負號。


關於排列順序。就我所知,Java中的所有I/O都是以大端的方式完成的。當然,通常它並不重要(字節數組,UTF-8編碼等不受字節序列的影響),但是許多方法都是DataInput。如果你的號碼存儲在小端,你必須自己轉換它。在我知道的標準Java中唯一的設施允許通過order()方法配置字節碼ByteBuffer,但是您打開了NIO的大門,我對此沒有太多的經驗。

+1

+1好建議! – aioobe 2011-05-20 20:57:14

+1

是的,這是更好的解決方案:) – 2011-05-20 21:12:44

+0

請注意,如果沒有在「0xFFFFFFFFFFFFFFFFFF」結尾的「L」,這個解決方案將不起作用,沒有L如果你的數字是負數,你的長也將是負數 – 2016-02-01 08:26:39

2

因爲在java中沒有unsigned int類型嗎? 爲什麼不是readLong()? 你可以讀朗,然後取第32位。

編輯 您可以嘗試

long value = Long.parseLong(Integer.toHexString(file.readInt()), 16); 
+0

*因爲在java中沒有unsigned int類型* *那麼,實際上有一個'readUnsignedByte' ... – aioobe 2011-05-20 20:47:56

+0

然後使用seek()返回4個字節,因爲readLong()會消耗太多的字節嗎? – musiKk 2011-05-20 20:48:48

+0

@aioobe,是的,抱歉,沒有注意到這些方法。 – 2011-05-20 20:51:34

3

編輯刪除readLong()

你可以使用readFully(byte[] b, int off, int len),然後轉換爲Long這裏的方法:How to convert a byte array to its numeric value (Java)?

+1

這會吃太多的字節,不是嗎? – aioobe 2011-05-20 20:44:29

+0

如果文件中的數字長度爲4個字節,這將無濟於事。 'readLong()'讀取8個字節。 – musiKk 2011-05-20 20:47:26

+0

沒錯,你可以使用'readFully()'然後轉換。 – 2011-05-20 20:49:50

0

根據你在做什麼int,你可能不需要把它變成很長。你只需要知道你正在執行的操作。畢竟它只有32位,你可以把它作爲有符號或無符號,如你所願。

如果你想玩ByteOrder,最簡單的事情可能是使用ByteBuffer,它允許你設置一個字節順序。如果您的文件小於2 GB,則可以將整個文件映射到內存中,並隨機訪問ByteBuffer。

相關問題