在Matlab中从C ++ / C#中读取自定义文件

时间:2014-08-04 14:46:38

标签: matlab

我知道二进制文件() - 在C#中创建的文件的结构,我想在MATLAB中读取/导入该文件。不幸的是,我已经尝试了所有可用的方法(fopen / fread,textscan等),但我无法阅读它。有人可以帮助我吗?

提前谢谢

1 个答案:

答案 0 :(得分:1)

我发现Matlab中的二进制文件解码速度相对较慢,因此您可能只想将数据作为C#的CSV文件输出,但这就是我解码文件的方法:

f = fopen(filename);
data = fread(f,inf,'*uint8');
fclose(f);

data_size = size(data,1);
index = 1;
byte = 1;

while byte < data_size
   decoded_data(index).val1 = typecast(data(byte:byte+1), 'uint16');
   byte = byte + 2;

   decoded_data(index).val2 = typecast(data(byte:byte+3), 'uint32');
   byte = byte + 4;

   decoded_data(index).val3 = typecast(data(byte:byte+7), 'double');
   byte = byte + 8;

   index = index + 1;
end

这是完全未经测试的(尽管我过去做过类似的事情),如果不知道数据的格式,很难提供很多详细信息。

我假设你的文件包含多种数据类型,但是,如果它只是一个单一类型的数组,你可以用以下代码替换while循环:

decoded_data = typecast(data, 'double');

如果你不习惯在Matlab中处理数据类型可能会有点痛苦(很多函数只能用于双精度)。所以你可以像所以在所有类型转换中包围一个演员:

decoded_data = double(typecast(data, 'double'));

修改

根据评论中的更新信息,我提出了以下解决方案。它假定字符串始终是固定长度。我没有做太多错误检查,但是如果找不到最后一个字符串则抛出错误。

filename = 'v1.hrv';
f = fopen(filename);
data = fread(f,inf,'*uint8');
fclose(f);

byte = 1;

decoded_data.name = char(data(byte+1:byte+23))';
byte = byte + 25;

decoded_data.version = char(data(byte:byte+14))';
byte = byte + 16;

decoded_data.patient_id = char(data(byte:byte+3))';
byte = byte + 5;

decoded_data.study = char(data(byte:byte+2))';
byte = byte + 4;

decoded_data.gender = char(data(byte));
byte = byte + 2;

decoded_data.string1 = char(data(byte:byte+2))';
byte = byte + 4;

decoded_data.sample_frequency = char(data(byte:byte+2))';
byte = byte + 4;

decoded_data.string2 = char(data(byte:byte+3))';
byte = byte + 4;

decoded_data.data_length = typecast(data(byte:byte+7), 'int64');
byte = byte + 8;

number_of_data_bytes = decoded_data.data_length * 4;
decoded_data.data = typecast(data(byte:byte+number_of_data_bytes-1), 'single');
byte = byte + number_of_data_bytes + 1;

if ~strcmp('Sample finished', char(data(byte:byte+14))')
   error('File not decoded correctly')
end