将8字节的little-endian二进制转换为双精度浮点数

时间:2011-06-24 16:58:55

标签: java parsing floating-point precision endianness

我有一个二进制文件,我逐字节读取。

我遇到了一个8字节长的部分,它持有一个双精度浮点数(小端)。我无法弄清楚如何读取它并通过屏蔽和/或投射来正确计算它。

(具体来说,文件类型是.LAS,但这无关紧要。)

有没有Java技巧?

5 个答案:

答案 0 :(得分:20)

您可以使用ByteBuffer

来自byte[] bytes

 double d = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN ).getDouble();

来自Socket

 ByteBuffer bb = ByteBuffer.allocate(64*1024).order(ByteOrder.LITTLE_ENDIAN );
 socket.read(bb);
 bb.flip();
 double d = bb.getDouble();

答案 1 :(得分:1)

这里描述了两种不同的方法:http://bytes.com/topic/java/answers/18253-big-endian-vs-little-endian-data。两者都有效。

答案 2 :(得分:1)

如果需要读取和交换字节顺序,可以使用Commons IO中的EndianUtils:

https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/EndianUtils.html

答案 3 :(得分:1)

  1. 从小端转换为大端。
  2. 将转换后的字节换成ByteBufferInputStream使用。
  3. 通过DataInputStream.readDouble(in)获取双精度数字。
  4. 或者,您可以从JDK源中获取readDouble方法的主体,并跳过第2步和第3步。

答案 4 :(得分:0)

只需使用DataInputStream即可阅读该文件,并使用readDouble()方法。