Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将8字节的小端二进制转换为双精度浮点_Java_Parsing_Floating Point_Precision_Endianness - Fatal编程技术网

Java 将8字节的小端二进制转换为双精度浮点

Java 将8字节的小端二进制转换为双精度浮点,java,parsing,floating-point,precision,endianness,Java,Parsing,Floating Point,Precision,Endianness,我有一个二进制文件,我逐字节读取 我遇到了一个8字节长的部分,其中包含一个双精度浮点(little endian)。我不知道如何读入这些内容,并通过掩蔽和/或投射正确计算它 (具体来说,文件类型是.LAS,但这不重要) 有什么Java技巧吗?这里介绍了两种不同的方法:。这两种方法都可以使用。只需使用a读取文件,然后使用readDouble()方法。您可以使用 从字节[]字节开始 double d = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_E

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

我遇到了一个8字节长的部分,其中包含一个双精度浮点(little endian)。我不知道如何读入这些内容,并通过掩蔽和/或投射正确计算它

(具体来说,文件类型是.LAS,但这不重要)


有什么Java技巧吗?

这里介绍了两种不同的方法:。这两种方法都可以使用。

只需使用a读取文件,然后使用
readDouble()
方法。

您可以使用

字节[]字节开始

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

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

如果需要读取和交换字节顺序,Commons IO中有EndianUtils:

  • 从小端到大端的转换
  • 将转换后的字节用
    ByteBufferInputStream
    包装
  • 通过
    DataInputStream.readDouble(in)
    获取双精度数字

  • 或者,您可以从JDK源代码中获取
    readDouble
    方法的主体,跳过步骤2和3。

    DataInputStream始终是“网络顺序”的,即big-endian。“应用程序使用数据输出流写入数据,稍后可由数据输入流读取”。我不认为这是一个非常坚实的贡献,这正是我所需要的。感谢您(以及回复如此之快的所有其他人!)祝您周末愉快。如果缓冲区不经常分配和重用,直接缓冲区会更好(第二个示例)。在这种情况下,我倾向于使用套接字读取缓冲区作为大小。@bestsss同意,如果管理正确,直接ByteBuffer会更好。我发现直接缓冲可以快20%。如果与不安全类一起使用,则可以再快30%。)非直接(字节[]备份)实际上是从由本机文件描述符(套接字/文件)读取时由TeBuffer分配的ThreadLocal复制的。链接已断开(“未找到。在此服务器上未找到请求的URL/proper/commons io/api release/org/apache/commons/io/EndianUtils.html”)。