Я пытаюсь прочитать двоичные данные, которые сохранены в равномерно распределенных блоках в файле. Каждый блок данных начинается с заголовка записи, который содержит переменную информацию о чтении файла. Заголовок всегда имеет постоянный размер в байтах. Затем я читаю данные заголовка, чтобы определить, что находится в блоке данных и как его читать. Для большинства блоков данных большая часть заголовка не используется. В питоне это выглядит так:
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 ++?