在Python中读取一个Delphi二进制文件

2024-06-02 05:04:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个用下面的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:错误
  • 堆栈帧:假
  • 优化:真

Tags: 文件of数据声明type记录integerrecord
3条回答

这里是完整的解决方案,多亏了基里安兹和里萨特·霍恩斯特拉的提示

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

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

请注意,当您在Delphi中定义一个记录(如C中的struct)时,字段是按顺序和二进制进行布局的(例如字节在1字节边界上对齐,单词在2字节上对齐,整数在4字节上对齐等等),但是它可能会因编译器的设置而有所不同。在

当序列化到一个文件时,你可能意味着这个记录以二进制形式写入到文件中,而下一个记录是在第一个记录之后从位置sizeof(structure)等开始写入的。Delphi没有指定如何将东西序列化到/从文件中序列化,因此您提供的信息让我们只能猜测。在

如果您想确保它始终相同而不受任何编译器设置的干扰,请使用压缩记录。在

Real可以有多种含义(对于早期的Delphi版本,它是一个48位的float类型,稍后是64位float(IEEE double))。在

如果您不能访问Delphi代码或自己编译它,只需使用HEX编辑器检查数据,您应该清楚地看到记录的边界,因为它们以整数开头,后面只有浮点。在

相关问题 更多 >