如何使用Python读写C语言生成的二进制文件中的float类型值
Python正确读写C语言生成的float类型二进制文件方案
你之前的方法错误原因有两个:
- C语言的
float是IEEE 754单精度浮点数,固定占4字节,你只读3个字节缺少必要数据,无法完成解析 - 读取到的原始字节没有做浮点数格式转换,直接转成整数列表自然无法得到正确的浮点值
Python官方内置的struct模块专门用于处理C语言基础类型和Python字节序列的双向转换,使用方法如下:
读取操作
对应你给出的C代码生成的file.bin(共10个连续存储的float值),读取代码示例:
import struct # 方式1:一次性读取所有10个float with open("file.bin", "rb") as f: # 格式符说明:@表示使用本机字节序,10f表示解析10个float类型 # 总读取长度=每个float占4字节 * 10 = 40字节 raw_data = f.read(4 * 10) float_list = struct.unpack("@10f", raw_data) print(float_list) # 方式2:循环逐个读取,适合文件长度未知的场景 float_list = [] with open("file.bin", "rb") as f: while True: raw_data = f.read(4) # 读到文件末尾结束循环 if len(raw_data) != 4: break # unpack返回的是元组,取第一个元素就是解析后的float值 single_val = struct.unpack("@f", raw_data)[0] float_list.append(single_val) print(float_list)
写入操作
如果需要用Python生成C语言可以直接读取的float类型二进制文件,示例代码如下:
import struct # 待写入的浮点数值列表 write_list = [1.1 * i for i in range(10)] # 按格式打包为字节序列,*表示把列表解包为位置参数 packed_data = struct.pack("@10f", *write_list) with open("python_output.bin", "wb") as f: f.write(packed_data)
注意事项
- 字节序匹配:如果跨设备读写文件,需要确认字节序一致:格式符用
<f表示小端序,>f表示大端序,替换示例中的@f即可 - 类型匹配:C语言的
double对应格式符d,占8字节,不要和float的f搞混
内容的提问来源于stack exchange,提问作者gabor aron
相关产品推荐
相关产品推荐

