Взломать двоичный формат файла, если у меня есть содержимое одного из этих файлов - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть около 300 измерений (каждое из которых хранится в файле данных), которые я хотел бы прочитать, используя MATLAB или Python. Файлы могут быть экспортированы в текстовый или CSV-файл с помощью проприетарной программы, но это должно быть сделано один за другим.

Вопрос: Каков наилучший подход для взлома формата двоичного файла с использованием известного содержимого из экспортируемого файла?

Не уверен, что это делаетесть какая-то разница, чтобы облегчить взлом, но файлы представляют собой только два столбца чисел (900k), и из размера файлов dat (1800668 байт) кажется, что каждое число равно 16 битам (с плавающей запятой), и есть некоторые другиеинформация (возможно, заголовок).

Я пытался использовать HEX-Editor, но не смог отследить какие-либо тренды оттуда.

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

Спасибо за любую помощь.

РЕДАКТИРОВАТЬ: Читая немного больше, я понял, что может произойти какое-то сжатие,Когда вы смотрите на данные в StreamWare, они дают 7 десятичных знаков, что наводит меня на мысль, что это значение с одинарной точностью (4 байта). Однако размер файлов предполагает, что каждое значение занимает всего 2 байта.

1 Ответ

0 голосов
/ 08 ноября 2019

Подумав еще немного, я наконец понял это. Это очень специфично, но на случай, если другой пользователь Dantec StreamWare столкнется с той же проблемой, это может сэкономить ему немного времени.

Во-первых, данные на самом деле представляют собой только один вектор. Столбец времени рассчитывается исходя из длины записанного сигнала и частоты дискретизации. Эта информация, вероятно, находится в заголовке (но я не смог взломать эту часть).

Чтобы получить значения в MATLAB, я пропустил байты заголовка, используя fseek(fid, 668, 'bof'), затем прочитал данные как uint16. используя fread(fid, 900000, 'uint16'). Это дает вам целые числа.

Чтобы получить значение с плавающей запятой, все, что вам нужно сделать, это разделить на 2 ^ 16 (это 16-битная система разрешения) и умножить на десять. Я предполагаю, что коэффициент десять зависит от диапазона вашей системы сбора данных.

Надеюсь, это поможет.

...