来自 fread 的 Matlab return 字节

Matlab return bytes from fread

我正在尝试读取保存在文件中均匀分布的块中的二进制数据。每个数据块都以记录 header 开头,其中包含有关读取文件的可变信息。 header 总是以字节为单位的恒定大小。然后我读取 header 数据以确定数据块中的内容以及如何读取它。对于大多数数据块,header 的大部分未使用。在 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 对从二进制文件读取的字符数组执行类似的操作。如您所见,存储在 header 中的信息取决于 header 本身中的先前信息。

在 Matlab 中,我正在努力处理 fread 并阅读整个 header 然后处理它。问题是我还没有找到一个好方法来 return 之后的字节是 post-processed。我最好的是这样的:

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');

与一次读取整个 header 的 python 和 C++ 方法相比,这非常慢。我试过像这样使用 typecase

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

这失败了,因为生成的不是单个数字而是大小为 8x1 的向量。如何像在 Python 和 C++ 中那样在 Matlab 中读取和 return 编辑一大块二进制数据(字节)?

您的问题是因为您正在读取字节并将它们转换为 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