在Python中读取Delphi二进制文件

7 投票
3 回答
1864 浏览
提问于 2025-04-15 21:57

我有一个文件,它是用以下Delphi声明写的...


Type
  Tfulldata = Record
    dpoints, dloops : integer;
    dtime, bT, sT, hI, LI : real;
    tm : real;
    data : array[1..armax] Of Real;
  End;

...
Var:
  fh: File Of Tfulldata;

我想用Python分析这个文件里的数据(文件大小有好几MB),请问有没有简单的方法可以读取这些数据,并把它们转换成类似Delphi记录的Python对象?有没有人知道有没有这样的库可以用?

这个文件是在Delphi 7上编译的,以下选项可能(也可能不)相关:

  • 记录字段对齐:8
  • Pentium安全FDIV:否
  • 堆栈帧:否
  • 优化:是

3 个回答

2

请注意,当你在Delphi中定义一个记录(类似于C语言中的结构体)时,字段的排列是有顺序的,并且是以二进制形式存储的,具体取决于当前的对齐方式(比如字节在1字节边界对齐,字在2字节边界对齐,整数在4字节边界对齐等等,但这可能会根据编译器的设置有所不同)。

当你把这个记录保存到文件中时,可能是指这个记录以二进制形式写入文件,接下来的记录会紧接着第一个记录写入,从位置sizeof(结构体)开始,依此类推。Delphi并没有明确规定如何将数据序列化到文件中,所以你提供的信息让我们很难猜测。

如果你想确保数据在不同的编译器设置下始终保持一致,可以使用“packed record”(紧凑记录)。

在Delphi中,Real类型有多种含义(在旧版本中是48位浮点数,后来变成了64位浮点数,即IEEE双精度)。

如果你无法访问Delphi代码或自己编译,可以尝试用十六进制编辑器查看数据,你应该能清楚地看到记录的边界,因为它们是以整数开始,后面跟着浮点数。

2

我不知道Delphi是怎么内部存储数据的,但如果它的数据很简单,就像字节那样(也就是说不是经过复杂处理的),你可以使用struct模块。这样,你就可以把Python文件中的字符串当作二进制数据来处理。另外,打开文件的时候要以二进制模式打开,像这样:file(open,'rb')

6

这里是完整的解决方案,感谢KillianDS和Ritsaert Hornstra的提示。

import struct
fh = open('my_file.dat', 'rb')
s = fh.read(40256)
vals = struct.unpack('iidddddd5025d', s)
dpoints, dloops, dtime, bT, sT, hI, LI, tm = vals[:8]
data = vals[8:]

撰写回答