Двоичный файл Matlab / Parse читается в память - PullRequest
0 голосов
/ 10 июля 2020

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

Несколько сообщений поощряют чтение всего файла в память. Звучит здорово. Однако никто не приводит примеров того, что делать с потоком байтов, который находится в памяти. Это большая работа, чтобы go побайтно и присвоить данные int32 , char , double . Есть ли более простой способ прочитать данные и / или проанализировать их?

fp = fopen('test.bin', 'wb');
fwrite(fp, 1, 'double');
fwrite(fp, 1, 'int32');
fclose(fp);

Итак, как мне прочитать это в этих двоичных данных и проанализировать их?

Ниже приводится описание формата файла из руководства по стороннему программному обеспечению:

Первая запись в файле представляет собой одно 32-битное целое число, указывающее версию и номер формата ZRD. файл. Вторая запись в файле представляет собой 32-битное целое число, указывающее максимально возможное количество сегментов в оставшихся записях. Фактическое количество сегментов всегда будет меньше или равно этому количеству.

Остальная часть файла состоит из 32-битного целого числа, указывающего количество следующих сегментов, затем это количество сегментов, затем еще 32 -битовое целое число, указывающее количество сегментов в следующей записи, и так далее до конца файла. Отдельный сегмент луча описывается структурой «C» в следующем формате:

typedef struct
{
unsigned int status;
int level;
int hit_object;
int hit_face;
int unused;
int in_object;
int parent;
int storage;
int xybin, lmbin;
double index, starting_phase;
double x, y, z;
double l, m, n;
double nx, ny, nz;
double path_to, intensity;
double phase_of, phase_at;
double exr, exi, eyr, eyi, ezr, ezi;
} RAYPATH;
...