如何用Python写入可被C代码正确读取的int、double类型二进制文件
Python生成匹配C fread读取规则的二进制文件方法
你需要用Python标准库内置的struct模块完成数值到C风格二进制字节流的转换。
注意:你预期的f.write(5)、f.write(5.0)写法无法直接运行,因为Python二进制文件的write()方法仅接受bytes/bytearray类型的字节串,直接传整数、浮点数会触发类型错误,struct.pack()的作用就是把高层Python数值转换成C语言对应的原始二进制字节序列。
可直接使用的实现代码
完全匹配你给出的C代码读取逻辑(先读1个int,再读1个double)的写入代码如下:
import struct # 二进制写模式打开目标文件 f = open('file.dat', 'wb') # 按C原生内存布局打包数值:=表示使用系统原生字节序与对齐规则,i对应C的int类型,d对应C的double类型 # 后续参数按顺序传入要写入的实际值即可 packed_bytes = struct.pack('=id', 5, 5.0) f.write(packed_bytes) f.close()
关键规则说明
- 格式串
=id的适配逻辑:=标记表示打包规则完全匹配当前运行C程序的系统原生类型长度、字节序、内存对齐规则,和你C代码里fread直接读内存的逻辑完全一致,不会出现偏移、长度不匹配问题。 - 如果你需要跨平台生成固定格式的文件(比如明确知道C侧运行环境是小端序、int占4字节、double占8字节,这是x86/arm架构下绝大多数服务器、桌面系统的默认配置),可以把格式串换成
<id,这样打包出来的字节流不会随Python运行的系统环境变化,兼容性更强。 - 常用格式符和C类型的对应关系:
i:对应C的signed intd:对应C的double(IEEE 754双精度浮点数)
- 你贴的C代码里
fopen用了"r"模式读二进制文件属于不规范写法,但你提到无法修改C代码,只要打包时的类型长度、字节序匹配,文件就可以被正常读取。
内容的提问来源于stack exchange,提问作者jonajona
相关产品推荐
相关产品推荐

