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