Matlab读取异构二进制数据

Matlab读取异构二进制数据,matlab,pointers,memcpy,fread,Matlab,Pointers,Memcpy,Fread,我想把异构二进制数据读入matlab。我从一开始就知道它的数量以及每个段的数据类型。例如: %double %double %int32 ... 然后这会重复一百万次。易于处理fread,因为用户知道每段的比特数,因此可以计算每行的跳过值 但现在数据段看起来像这样: %double %int32%*char %double %double ... 其中,*char之前的int是所述字符串的长度。这带来了一个问题,我无法再计算跳过,我被困在整个文件逐行读取,因此需要进行更多的文件访问,并减缓一

我想把异构二进制数据读入matlab。我从一开始就知道它的数量以及每个段的数据类型。例如:

%double %double %int32 ...
然后这会重复一百万次。易于处理
fread
,因为用户知道每段的比特数,因此可以计算每行的跳过值

但现在数据段看起来像这样:

%double %int32%*char %double %double ...
其中,
*char
之前的
int
是所述字符串的长度。这带来了一个问题,我无法再计算跳过,我被困在整个文件逐行读取,因此需要进行更多的文件访问,并减缓一切

为了获得至少一些速度,我不想一次读入所有
%double%double…
(大约30个元素),然后使用缓冲区中的元素填充数组中的元素。在C中,这将是一个相当简单的任务,没有memcpy,也没有直接访问指针


如果不使用mex文件,您知道实现这一点的方法吗?

您无法解决记录大小未知的问题,因此您不知道要提前读取多少。但是您可以批量读取,如果您有一个合理的字符串最大大小,您可以始终读取该数量,并忽略末尾不需要的字节
typecast
是诀窍:

readlen = 1024;
buf = fread(fid, readlen, '*uint8');   % the asterisk keeps the returned array as uint8
rec.val1 = typecast(buf(1:8), 'double');
string_len = typecast(buf(9:12), 'int32');
rec.str1 = typecast(buf(13:13+string_len-1), 'uint8');

pos = 13+string_len;
rec.val2 = typecast(buf(pos:pos+8-1), 'double');

您可以围绕这项技术使用一个简单的函数来自动跟踪当前偏移量。

我认为没有内置函数,它可以理解“读取此int告诉您的字符数”。由于格式的这种“动态性质”,我想重复的freads是唯一的选择。另一种想法是:如果您对格式有影响,您可能会考虑使用固定长度存储字符,必要时用零填充较短的字符数组。这只适用于所有字符数组都在一定长度内的情况…@sebastian。不幸的是,我在这方面没有任何控制权。它几乎是固定的,因为它是。否则我会选择像HDF5这样的东西,我就不必处理所有这些…你可以在Matlab中编写Java命令。使用这些函数,您应该能够使用与C.@bdecaf中的函数类似的函数,而这些函数并不是真正需要的-它可能不会比使用matlab的
fread
更快。非常好。我不知道matlab中存在typecast。非常感谢。