Matlab возвращает байты из фреда - PullRequest
0 голосов
/ 15 мая 2019

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

headerBytes = in_file.read(rSize)
aCode = unpack('1i', headerBytes[0:4])
bCode = unpack('1i', headerBytes[4:8])
....
subcase = unpack(str(len(headerBytes[aCode:bCode]))+'s',headerBytes[aCode:bCode])

Я могу сделать что-то подобное в C ++ с reinterpretcast для массива символов, считанного из двоичного файла. Как видно, информация, хранящаяся в заголовке, зависит от предыдущей информации в самом заголовке.

В Matlab я борюсь с fread и читаю весь заголовок, а затем обрабатываю его. Проблема в том, что я не нашел хорошего способа вернуть байты для последующей обработки позже. Лучшее, что у меня есть, примерно так:

aCode = fread(fid, 1, 'int');
bCode = fread(fid, 1, 'int');
.... <Conditional statements including fread, fseek, etc to further process
subcase = fread(fid, bCode - aCode, 'char');

Это очень медленно по сравнению с Python и C ++ способами чтения всего заголовка сразу. Я пытался использовать typecase так:

header = fread(fid, 584, 'char');
aCode = typecast(header(1:4), 'int32');

Это не дает результата, создавая не одно число, а вектор размером 8x1. Как можно прочитать и вернуть кусок двоичных данных (байты) в Matlab, как в Python и C ++?

1 Ответ

1 голос
/ 15 мая 2019

Ваша проблема в том, что вы читаете байты и приводите их к удвоениям в вашем fread утверждении. Таким образом, header(1:4) равно 4 двойным, что приводит к int32, что дает вам 8 значений.

Правильный способ чтения данных -

header = fread(fid, 584, '*uint8');

* в типе указывает, что выходной массив должен быть того же типа. Это эквивалентно 'uint8=>uint8'. 'uint8' сам по себе эквивалентен 'uint8=>double'. Тип после части => является типом выходного массива.

Вы можете использовать uchar вместо uint8, если хотите, хотя я предпочитаю держаться подальше от char типов, так как иногда они составляют 16 байтов.

См. этот раздел fread документации для получения дополнительной информации.

...