将二进制文件读取(fread)代码从 MATLAB 转换为 C#

Posted

技术标签:

【中文标题】将二进制文件读取(fread)代码从 MATLAB 转换为 C#【英文标题】:Converting binary file reading (fread) code from MATLAB to C# 【发布时间】:2019-12-03 05:35:19 【问题描述】:

我需要在 C# 中重现我找到的读取二进制文件的 MATLAB 代码。代码是:

% Skip header
fread(fid, 1, 'int32=>double', 0, 'b');

% Read one property at the time
i = 0;
while ~feof(fid)
  i = i + 1;

  % Read field name (keyword) and array size
  keyword = deblank(fread(fid, 8, 'uint8=>char')');
  keyword = strrep(keyword, '+', '_');
  num = fread(fid, 1, 'int32=>double', 0, 'b');

  % Read and interpret data type
  dtype = fread(fid, 4, 'uint8=>char')';
End

fclose(fid)

我尝试了几种在 C# 中读取二进制文件的方法,但都没有得到正确的结果。我应该如何进行?

这就是我所做的,到目前为止似乎有点工作

        FileStream fs = new FileStream(filename, FileMode.Open);
        BinaryReader binreader = new BinaryReader(fs,Encoding.Default);

        //skip head
        binreader.ReadInt32();
        for (int i = 0; i < 8; i++)
        
            keyword = keyword + binreader.ReadChar();
        

        keyword = keyword.TrimEnd();
        keyword = keyword.Replace("+", "_");
        num = binreader.ReadInt32();

        for (int i = 0; i < 4; i++)
        
            dtype = dtype + binreader.ReadChar();
        

问题是我应该得到:keyword=INTERHEAD, num=411 and dtype=INTE 但我得到的是:keyword=INTERHEAD, num=-1694433280 and dtype=INTE 问题在于正确获取 num 变量。

我已将 readint32 更改为 readdouble、readUint32 等,但从未得到 411。

有什么帮助吗?

【问题讨论】:

这听起来像是 C# 中非常常见的操作。你应该展示你在 C# 中的尝试,并解释为什么你认为结果是错误的。如果可能,请上传/链接这种类型的小型二进制文件并显示预期结果。如果不执行上述任何操作,您的问题根本无法重现,听起来像是代码请求。 您是否尝试过文档? BinaryReader Class,尤其是方法:ReadChars 和 ReadInt32 【参考方案1】:

这可能是在num 部分读取/接收错误字节序的问题吗?

【讨论】:

以上是关于将二进制文件读取(fread)代码从 MATLAB 转换为 C#的主要内容,如果未能解决你的问题,请参考以下文章

Matlab中fread()读出的数据怎么和原来不一致了?

fread函数的用法

Matlab 中fread的问题

matlab 打开bin文件 并转换成为txt文件,送上所有积分

matlab 的fread函数,[a,count]=fread(fid,size,precision,skip),skip参数的作用是啥?

fread函数