我的“答案”实际上是对各种答案的评论。我没有 50 声望,所以无法发表评论。
如果要由 Python 读回文件,则使用“pickle”模块。这个工具可以用二进制读写很多东西。
但问题的方式是“IEEE 32 位编码”,听起来文件会以其他语言读回。在这种情况下,应指定字节顺序。问题是大多数机器都是 x86,采用 little-endian 字节顺序,但排名第一的数据处理语言是 Java/JVM,使用 big-endian 字节顺序。所以Python的tofile()会使用C,由于机器是little-endian,所以使用little endian,然后Java/JVM上的数据处理代码会使用big endian进行解码,导致报错。
使用 JVM:
# convert to bytes, BIG endian, for use by Java
import struct
f = [3.14, 2.7, 0.0, -1.0, 1.1]
b = struct.pack('>'+'f'*len(f), *f)
with open("f.bin", "wb") as file:
file.write(b)
在 Java 方面:
try(var stream = new DataInputStream(new FileInputStream("f.bin")))
{
for(int i = 0; i < 5; i++)
System.out.println(stream.readFloat());
}
catch(Exception ex) {}
现在的问题是 Python 'f'*len(f) 代码 - 希望解释器实际上不会创建超长的“ffffff...”字符串。
我会使用 numpy 数组和字节交换
import numpy, sys
f = numpy.array([3.14, 2.7, 0.0, -1.0, 1.1], dtype=numpy.float32)
if sys.byteorder == "little":
f.byteswap().tofile("f.bin") # using BIG endian, for use by Java
else:
f.tofile("f.bin")