Matlab读取异构二进制数据

时间:2014-01-29 07:41:53

标签: matlab pointers memcpy fread

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

%double %double %int32 ...

然后重复大约一百万次。使用fread可以轻松处理,因为知道每个段的咬合次数,因此可以计算每行的跳过值。

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

%double %int32%*char %double %double ...

因此int之前的*char是所述字符串的长度。这带来了我无法再计算跳过的问题而且我一直在逐行读取整个文件,因此需要进行更多的文件访问并减慢速度。

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

你知道如何实现这一点,而不是使用mex文件吗?

1 个答案:

答案 0 :(得分:1)

您无法解决记录大小未知的问题,因此您不知道提前阅读了多少。但是你可以批量读取,如果你有一个合理的字符串最大大小,你总是可以读取该数量,并忽略最后不需要的字节。 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');

您可以围绕此技术包装一个简单的函数来自动跟踪当前偏移量。