Sam*_*hie 2 floating-point numpy clojure endianness
有没有人有任何关于如何使用java或clojure从二进制文件中读取浮点值的建议?我将我当前的值与Python的NumPy nump.fromfile('path', dtype="f")
方法的结果进行比较,而我根本得不到相同的答案.我怀疑这是因为Java的DataInputStream.readFloat()
方法假定二进制文件是由java编写的,如本文档所示:
读取四个输入字节并返回一个浮点值.它通过首先以readInt方法的方式构造一个int值,然后将此int值完全按照方法Float.intBitsToFloat的方式转换为float来实现.此方法适用于读取由接口DataOutput的writeFloat方法写入的字节.
所以,我认为java正在向后读取浮点值.前十二个字节是:
(0 -64 121 -60 0 -64 121 -60 0 -64 121 -60)
Run Code Online (Sandbox Code Playgroud)
Clojure/java认为这是重复的1.7676097E-38
,而NumPy和Python认为它重复了-999.0
.作为参考,我正在使用这个数据集.
Java在java.io中使用"网络顺序"(big endian).但是java.nio允许您选择要应用的字节序:
user=> (-> (map byte [0 -64 121 -60]) byte-array java.nio.ByteBuffer/wrap
(.order java.nio.ByteOrder/LITTLE_ENDIAN) .getFloat)
-999.0
Run Code Online (Sandbox Code Playgroud)
下一步是要么在一个字节数组中读取整个文件,要么FileChannel
从a 创建一个FileInputStream
,然后mmap它并ByteBuffer
使用生成的mmaped读取.getFloat
.