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

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

  • Рекордное полевое выравнивание: 8
  • Pentium безопасный FDIV: ложь
  • Стековые фреймы: ложь
  • Оптимизация: верный
6
задан Brendan 26 April 2010 в 18:31
поделиться

3 ответа

Вот полные решения благодаря подсказкам 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:]
5
ответ дан 10 December 2019 в 02:44
поделиться

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

2
ответ дан 10 December 2019 в 02:44
поделиться

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

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

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

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

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

2
ответ дан 10 December 2019 в 02:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: