Java 将8字节的小端二进制转换为双精度浮点
我有一个二进制文件,我逐字节读取 我遇到了一个8字节长的部分,其中包含一个双精度浮点(little endian)。我不知道如何读入这些内容,并通过掩蔽和/或投射正确计算它 (具体来说,文件类型是.LAS,但这不重要)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
有什么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”)。