我正在尝试读取保存在文件中均匀间隔的块中的二进制数据。每个数据块均以记录头开头,该记录头包含有关读取文件的可变信息。标头始终是恒定大小(以字节为单位)。然后,我读取标题数据以确定数据块中的内容以及如何读取它。对于大多数数据块,大多数头均未使用。在python中看起来像这样:
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的向量。像Python和C ++一样,如何在Matlab中读取并返回二进制数据块(字节)?
答案 0 :(得分:1)
您的问题是因为您正在读取字节,并将它们转换为fread
语句中的双精度字。因此header(1:4)
是4的双打,强制转换为int32
会给您8个值。
读取数据的正确方法是
header = fread(fid, 584, '*uint8');
类型中的*
表示输出数组应为相同类型。它等效于'uint8=>uint8'
。 'uint8'
本身等效于'uint8=>double'
。 =>
部分后面的类型是输出数组的类型。
如果愿意,可以使用uchar
代替uint8
,尽管我宁愿远离char
类型,因为有时它们是16字节。
有关更多信息,请参见this section of the fread
documentation。