用Python读取Delphi二进制文件

时间:2010-04-23 16:13:21

标签: python delphi file-io

我有一个用以下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
  • 奔腾安全FDIV:错误
  • Stack Frames:False
  • 优化:正确

3 个答案:

答案 0 :(得分:5)

感谢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:]

答案 1 :(得分:2)

我不知道Delphi如何在内部存储数据,但如果它是简单的逐字节数据(因此不是序列化和损坏的),请使用struct。这样,您可以将python文件中的字符串视为二进制数据。另外,打开文件为二进制文件file(open,'rb')

答案 2 :(得分:2)

请注意,当您在Delphi中定义记录时(如C中的struct),字段按顺序排列,并且在给定当前对齐的情况下以二进制形式排列(例如,字节在1字节边界上对齐,字节在2字节上,整数在4字节等,但可能因编译器设置而异。

当序列化为文件时,您可能意味着该记录以二进制形式写入文件,而下一条记录是在第一个从位置sizeof(结构)等开始写入之后等等.Delphi没有说明应该如何序列化到/从文件,所以你提供的信息让我们猜测。

如果要确保它始终相同而不受任何编译器设置的干扰,请使用打包记录。

Real可以有多种含义(对于较旧的Delphi版本,它是48位浮点型,后来是64位浮点数(IEEE double))。

如果您无法访问Delphi代码或自行编译,只需使用HEX编辑器检查数据,您应该清楚地看到记录的边界,因为它们从Integers开始,只有浮点数跟随。