2011-05-20 52 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。

相关问题