【问题标题】:Reading custom-made files from C++/C# in Matlab在 Matlab 中从 C++/C# 读取定制文件
【发布时间】:2014-08-04 14:46:37
【问题描述】:

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

提前谢谢你

【问题讨论】:

  • 你能详细说明一下吗?当您尝试读取这些文件时会发生什么?你有错误吗?
  • @MZimmerman6 请看下面的 cmets。我希望你能帮忙。

标签: matlab


【解决方案1】:

我发现在 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

【讨论】:

  • 首先,感谢您抽出宝贵时间回答我的问题。我的问题是,当我尝试这样做时,""data = fread(f,inf,'*uint8');"" 返回一个空值,所以数据是空的......
  • 这是结构: bw = New BinaryWriter(myStream) bw.Write("My company ECG") // string bw.Write("Version 1.0.0.0") //string bw.Write ("1001") 'String –Patient ID //string bw.Write("001") 'String –Study ID //string bw.Write("1") 'Integer –gender: 0 male,1 female //string bw.Write("ECG") //string bw.Write("500") //string bw.Write("test") //string bw.Write(datas_length) //long or int64 For i As Long = 0 To datas_length - 1 bw.Write(ChannelData(i)) //float Next bw.Write("Sample finished") //string bw.Close()
  • 没问题。希望我们能找到问题的根源...fopenfread 非常简单,我很难想象出了什么问题,所以也许值得检查一下基础知识?您能否检查文件是否正确打开(f 的值应该 >= 3)?你能检查你打开的文件的大小是否大于 0 字节?如果你使用data = fread(f);,你会得到任何数据吗?如果您将二进制文件的副本上传到某个地方,我会在这里试一试。
  • 是的,我可以读取文件,但它不是我想要的顺序。我做错了什么。我尝试遵循我之前发布的结构。文件在这里@sclarke81。 link
  • 您的代码似乎工作正常,尽管它会弹出一个错误“下标索引必须是真正的正整数或逻辑。测试中的错误(第 11 行)decoded_data(index).name = char(data(byte +1:字节+23))';"由于增量处理不当。我只想提取存储在这个 hrv 文件中的数据以便处理它们。 @sclarke81
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 2014-04-02
相关资源
最近更新 更多