Чтение двоичного файла Delphi в Python - PullRequest
6 голосов
/ 23 апреля 2010

У меня есть файл, который был написан со следующей декларацией 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, если это возможно - есть ли простой способ чтения данных и преобразования данных в объекты Python, похожие по форме на записи Delphi? Кто-нибудь знает о библиотеке, возможно, это делает?

Это скомпилировано в Delphi 7 со следующими параметрами, которые могут (или не могут) быть уместными,

  • Выравнивание поля записи: 8
  • Pentium Safe FDIV: False
  • Фреймы стека: False
  • Оптимизация: True

Ответы [ 3 ]

5 голосов
/ 26 апреля 2010

Вот полные решения благодаря подсказкам от 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:]
2 голосов
/ 26 апреля 2010

Обратите внимание, что когда вы определяете запись в Delphi (например, struct в C), поля располагаются по порядку и в двоичном формате с учетом текущего выравнивания (например, байты выровнены по границам в 1 байт, слова по 2-байтным, целые по 4 байта и т. Д., Но может варьироваться в зависимости от настроек компилятора.

При сериализации в файл вы, вероятно, имеете в виду, что эта запись записывается в файл в двоичном виде, а следующая запись записывается после первой, начиная с позиции sizeof (структура) и т. Д. И т. Д. Delphi не указывает, как все должно быть сериализовано в / из файла, поэтому информация, которую вы предоставляете, оставляет нас в догадках.

Если вы хотите убедиться, что оно всегда одинаково, без вмешательства каких-либо настроек компилятора, используйте упакованную запись.

Вещественное может иметь несколько значений (это 48-разрядный тип с плавающей запятой для более старых версий Delphi, а затем 64-разрядный с плавающей запятой (IEEE double)).

Если вы не можете получить доступ к коду Delphi или скомпилировать его самостоятельно, просто проверьте данные с помощью HEX-редактора, вы должны четко видеть границы записей, поскольку они начинаются с целых чисел и следуют только за числами с плавающей запятой.

2 голосов
/ 23 апреля 2010

Я не знаю, как Delphi хранит данные внутри себя, но если это такие же простые побайтные данные (не сериализованные и не искаженные), используйте struct . Таким образом, вы можете рассматривать строку из файла Python как двоичные данные. Также открывайте файлы как двоичные файлы file(open,'rb').

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...