代码之家  ›  专栏  ›  技术社区  ›  Robert Dodier

在.mat文件的“函数工作区”字段中包含什么?

  •  0
  • Robert Dodier  · 技术社区  · 7 年前

    我正在处理保存在程序末尾的.mat文件。命令是 save foo.mat __function_workspace__ 有些变化。

    (我正在通过检查.mat文件 scipy.io.loadmat save -ascii 在Matlab中,不会在对象上放置字符串标签,因此通过Python是迂回的,但我得到了标签,这很有用。)

    我正试图确定这些变化的起源。有人能解释一下吗 包含?为什么从一个给定程序的一次运行到下一次运行会不一样呢?

    我真正感兴趣的变量是相同的,但我担心我可能忽略了一些可能会反过来咬我的变化。提前谢谢你对这个问题的解释。

    编辑:正如我在评论中提到的 __功能\u工作区__

    第二次编辑:我发现在注释掉对plotting函数的调用之后 __功能\u工作区__ 从一次运行到下一次运行都是一样的,所以这很好。在这一点上,从一个运行到下一个运行的唯一区别是有一个 __header__ 字段,该字段包含创建.mat文件的时间戳,该时间戳在运行时会发生变化。

    第三次编辑:我发现一篇文章, http://nbviewer.jupyter.org/gist/mbauman/9121961 “解析包含类对象的MAT文件”,关于逆向工程 现场。感谢马特·鲍曼的这篇非常有启发性的文章,感谢@mpaskov的指点。看来 是一个没有文档记录的各种东西的总括,其中只有一部分实际上是一个“函数工作区”。

    0 回复  |  直到 7 年前
        1
  •  1
  •   Florian Enner    6 年前

    1) Diffing.mat文件

    DiffPlug . 它可以做不同的MAT文件,我相信有一个命令行界面为它以及。

    2) 功能区内容

    西皮的 __function_workspace__ 指MAT文件末尾的特殊变量,该变量包含引用类型所需的额外数据(例如。 table string , handle 等)以及官方文件未涵盖的各种其他内容。这个名称是误导性的,因为它实际上指的是“子系统”(在官方规范中简短地提到,作为标题中的偏移量)。

    例如,如果保存引用类型,例如。, emptyString = "" ,结果 .mat 将包含以下两个条目:

    (1) 变量本身。看起来有点像 UInt32 矩阵,但实际上是一个 Opaque MCOS Reference 一串 对象位于子系统中的某个位置。

     [0] Compressed (81 bytes, position = 128)
      [0] Matrix (144 bytes, position = 0)
        [0] UInt32[2] = [17, 0] // Opaque
        [1] Int8[11] = ['emptyString'] // Variable Name
        [2] Int8[4] = ['MCOS'] // Object Type
        [3] Int8[6] = ['string'] // Class Name
        [4] Matrix (72 bytes, position = 72)
          [0] UInt32[2] = [13, 0] // UInt32
          [1] Int32[2] = [6, 1] // Dimensions
          [2] Int8[0] = [''] // Variable Name (not needed)
          [3] UInt32[6] = [-587202560, 2, 1, 1, 1, 1] // Data (Reference Target)
    

    (2) A UInt8 __功能\u工作区__ )在文件的末尾。除了缺少名称之外,它看起来像一个标准的矩阵,但是数据实际上是另一个包含真实数据的MAT文件(带有一个简化的头文件)。

    [1] Compressed (251 bytes, position = 217)
      [0] Matrix (968 bytes, position = 0)
        [0] UInt32[2] = [9, 0] // UInt8
        [1] Int32[2] = [1, 920] // Dimensions
        [2] Int8[0] = [''] // Variable Name
        [3] ... 920 bytes ... // Data (Nested MAT File)
    

    struct 包含特殊变量的( MCOS FileWrapper__ )它包含一个具有各种值的单元格数组,包括一个对各种值进行神奇编码的数组 Object Properties

    马特鲍曼做了一些伟大的反向工程的努力( Parsing MAT files with class objects in them )我相信所有的支持实现都是基于此。这个 MFL Java库包含了这个的完整(只读)实现(参见 McosFileWrapper.java

    我们在马特·鲍曼的帖子中发现了一些更新:

    • MCOS引用可以引用句柄对象数组,并且可能有6个以上的值。它包含大小调整信息,后跟一个索引数组(请参见 McosReference.java ).
    • Object Id
    • 我见过 Segment 5 .fig 文件,但我还没能缩小里面的范围。

    testDoubleQuoteString )