问题描述
|
我只是发现
RandomAccessFile
类中没有readUnsignedInt
()方法。为什么?有什么解决方法可以从文件中读取未签名的int?
编辑:
我想从文件中读取一个无符号的int并将其放入较长的空间。
编辑2:
无法使用readLong()。它将读取8个字节而不是4个字节。文件中的数据具有4字节范围内的无符号整数。
编辑3:
在这里找到答案:http://www.petefreitag.com/item/183.cfm
编辑4:
如果数据文件是小端的怎么办?我们需要先交换位吗?
解决方法
我会这样做:
long l = file.readInt() & 0xFFFFFFFFL;
位操作是必需的,因为上行将扩展负号。
关于字节序。据我所知,Java中的所有I / O都是以大端方式进行的。当然,通常并不重要(字节数组,UTF-8编码等不受字节顺序的影响),但是许多DataInput
方法都可以。如果您的数字以小尾数法存储,则必须自己进行转换。我知道的标准Java中唯一允许配置字节序的工具是通过order()
方法实现的ByteBuffer
,但是您打开了NIO的大门,而我对此没有太多的经验。
,编辑删除remove6ѭ:
您可以使用readFully(byte[] b,int off,int len)
,然后使用以下方法转换为Long
:如何将字节数组转换为其数值(Java)?
,因为在Java中没有unsigned int类型?
为什么不readLong()
?
您可以读长,然后取前32位。
编辑
你可以试试
long value = Long.parseLong(Integer.toHexString(file.readInt()),16);
,根据您对int
所做的操作,可能不需要将其变长。您只需要知道所执行的操作即可。毕竟它只有32位,您可以根据需要将其视为有符号的或无符号的。
如果要使用ByteOrder,最简单的操作可能是使用ByteBuffer,它允许您设置字节顺序。如果您的文件小于2 GB,则可以将整个文件映射到内存中并随机访问ByteBuffer。