Содержимое неформатированного двоичного файла f77 - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть неформатированный двоичный файл f77.Я знаю, что файл содержит 2 числа с плавающей запятой и длинное целое число, а также данные.Размер файла составляет 536870940 байт, который должен включать 512 ^ 3 значений данных с плавающей запятой вместе с двумя числами с плавающей запятой и длинным целым числом.512 ^ 3 значений с плавающей запятой составляют 536870912 байт, оставляя еще 28 байтов.

Моя проблема в том, что мне нужно выяснить, где начинается 28 байтов и как пропустить этот объем памяти, чтобы я мог получить прямой доступ к данным.

Я предпочитаю использовать C для доступафайл.

1 Ответ

0 голосов
/ 11 декабря 2018

К сожалению, нет стандартного значения unformatted.Но некоторые методы более распространены, чем другие.

Во многих версиях Fortran, которые я использовал, каждая команда write записывает заголовок (часто без знака int 32) количества байтов данных, затем данных, затемповторяет значение заголовка в случае, если вы читаете сзади.

Из предоставленных вами значений может быть, что у вас есть что-то вроде этого:

  • uint32 (заголовок record1), вероятно 12.
  • float32, float32, int32 (три «других значения», о которых вы говорили)
  • uint32 (заголовок record1, такой же, как первое значение)
  • uint32(заголовок записи 2, вероятно, 512 ^ 3 * 4)
  • float32 * 512 ^ 3
  • uint32 (заголовок записи 2, такой же, как и раньше)

Возможно, вам придетсяпроверьте порядковый номер.

Поэтому я предлагаю вам открыть файл в программе hexdump и проверить, идентичны ли байты 0-3 байтам 16-19 и повторяются ли байты 20-23 в конце данных.снова.

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

Примечание: Я предполагаю, что эти три других значения являются метаданными о данных, ипоэтому будет в начале файла.Если это не так, они могут быть в конце.

Обновление:

В своем комментарии вы пишете, что ваши данные начинаются с чего-то вроде этого:

0C 00 00 00 XX XX XX XX XX XX XX XX XX XX XX XX 0C 00 00 00
^- header-^                                     ^-header -^
E8 09 FF 1F (many, many values) E8 09 FF 1F
^- header-^ ^--- your data ---^ ^-header -^

Теперь я не знаю, как читать данные в C. Я оставляю это на ваше усмотрение.Вам нужно пропустить первые 24 байта, а затем прочитать данные как (вероятно, с прямым порядком байтов) 4-байтовые плавающие значения.У вас останется 4 байта, которые вам больше не нужны.

Важное примечание: Fortran хранит массивы столбцов-мажоров, Cafaik хранит их мажор-строк.Так что имейте в виду, что порядок индексов будет обратным.

Я знаю, как читать это на Python:

from scipy.io import FortranFile
ff = FortranFile('data.dat', 'r', '<u4')
# read the three values you are not interested in
threevals = ff.read_record('<u4')
# read the data
data = ff.read_record('<f4')
ff.close()
...