I have a binary file that I read byte by byte.
I come acros开发者_JAVA百科s a section that is 8 bytes long, holding a double precision float (little endian). I can't figure out how to read this in and calculate it properly with masking and/or casting.
(To be specific, the file type is .LAS, but that shouldn't matter).
Are there any Java tricks?
You can use ByteBuffer
from a byte[] bytes
double d = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN ).getDouble();
from a Socket
ByteBuffer bb = ByteBuffer.allocate(64*1024).order(ByteOrder.LITTLE_ENDIAN );
socket.read(bb);
bb.flip();
double d = bb.getDouble();
Two different approaches are described here: http://bytes.com/topic/java/answers/18253-big-endian-vs-little-endian-data. Both would work.
- Convert from little endian to big endian.
- Wrap your converted bytes in
ByteBufferInputStream
use. - Get your double precision number via
DataInputStream.readDouble(in)
.
Alternatively, you can just take the body of the readDouble
method from JDK source and skip step 2 and 3.
If you need to read and swap byte order, there is EndianUtils from Commons IO:
https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/EndianUtils.html
Just use a DataInputStream
to read the file, and use the readDouble()
method.
精彩评论