我发现在 Matlab 中解码二进制文件相对较慢,因此您可能需要考虑仅将数据作为 CSV 文件从 C# 输出,但是,我将采用以下方式解码您的文件:
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'));
编辑:
根据 cmets 中的更新信息,我提出了以下解决方案。它假定字符串始终是固定长度。我没有做太多的错误检查,但是如果没有找到最终的字符串就会抛出错误。
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