为什么RandomAccessFile类中没有readUnsignedInt?

时间:2011-05-20 20:39:23

标签: java

我刚发现readUnsignedInt类中没有RandomAccessFile()方法。为什么?是否有任何解决方法可以从文件中读取unsigned int?

修改

我想从文件中读取unsigned int并将其放入长空间。

EDIT2:

无法使用readLong()。它将读取8个字节而不是4个字节。文件中的数据在4个字节范围内具有无符号整数。

EDIT3:

在这里找到答案:http://www.petefreitag.com/item/183.cfm

Edit4:

如果数据文件是little-endian怎么样?我们需要先换位?

4 个答案:

答案 0 :(得分:19)

我会这样做:

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

位操作是必要的,因为向上转换将延伸一个负号。


关于字节序。据我所知,Java中的所有I / O都是以大端方式完成的。当然,通常无关紧要(字节数组,UTF-8编码等不受字节顺序影响),但DataInput的方法很多。如果您的号码以小端存储,则必须自行转换。我知道的标准Java中唯一的工具允许通过ByteBuffer方法配置字节顺序为order(),但是你打开NIO的门,我没有很多经验。< / p>

答案 1 :(得分:3)

已修改删除readLong()

您可以使用readFully(byte[] b, int off, int len)然后使用以下方法转换为LongHow to convert a byte array to its numeric value (Java)?

答案 2 :(得分:2)

因为java中没有unsigned int类型? 为什么不readLong()? 你可以读取Long然后取32位。

修改 你可以尝试

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

答案 3 :(得分:0)

根据您使用int所做的操作,您可能不需要将其变为长时间。您只需要知道您正在执行的操作。在它只有32位后,您可以根据需要将其视为有符号或无符号。

如果你想玩ByteOrder,最简单的方法就是使用ByteBuffer,它允许你设置一个字节顺序。如果您的文件小于2 GB,则可以将整个文件映射到内存中并随机访问ByteBuffer。