在数据结构中引用外部数据文件中的数据结构文件

Referencing Kaitai Struct file (ksy) in external ksy file in Kaitai Struct

我正在尝试在 Kaitai Struct 中实现文件结构化,这意味着我需要创建 ksy 文件可以被另一个 ksy 文件引用,所以当我编译到我的目标语言时(java 在我的例子中) java 代码将被优化并重复使用通常创建的 ksy 文件,而不是冗余生成的 java 代码。

我试过模仿"Referencing enums in external file in Kaitai Struct"但是没有成功。

我开始查看 "imports",这意味着在外部 ksy 文件中导入 ksy 文件,我将广泛解释我尝试做和实现的内容:

  1. 我为 data_types(自定义数据类型)创建了一个 ksy,它不引用任何东西,只是带有 id 的元部分,然后是类型,我开始列出我所有的自定义数据类型(datatypeone,datatypetwo。 ..)
  2. 我为机器类型创建了一个 ksy,每种类型都有 "seq" 个字段,每个字段都引用上述数据类型之一,这里的挑战在于 machineType.ksy,我添加dataType.ksy as imports ,我不太确定这样做的语法是什么,Webide 中的 Kaitai struct 编译器一直告诉我未定义的自定义数据类型,例如数据类型一未定义。

是否对要引用的文件数量有限制,例如我可以从文件b引用文件a,从文件c引用文件b,从文件d引用文件c,意味着文件d有"imports of c",文件c有"imports of b "等等。

这个问题没有单一的答案,这取决于你想如何构建你的项目。您的选择是:

  • 每个 .ksy 文件一种类型。这意味着不是将 datatypeonedatatypetwo 等作为二级嵌套类型(在 types: 中列出)放入单个文件中,而是可以将 datatypeone 放入 datatypeone.ksydatatypetwodatatypetwo.ksy 等,并在适用的地方单独导入它们。

  • 你可以继续你的想法,在这种情况下正确的导入语法是:

    meta:
      id: machine_type
      imports:
        - datatype # refers to datatype.ksy
    seq:
      - id: foo
        type: datatype::datatypeone
    
  • 想想你为什么真的想把东西分开放在多个文件里?例如,将所有内容放在一个 .ksy 文件中也是一种选择,它解决了代码重复问题。

还有许多其他正当理由将它们分开,但请注意,Kaitai Struct 拥有多个文件的想法与 C++ 或 [=47]不同 =].鉴于 "ksy file" 中的所有条目都隐含地共享相同的 _root,那么文件边界分离应该由这个连接而不是一些其他规则来评估(比如 1 class = 1 文件,如Java,或 1 个文件 = 1 个编译单元,如在 C++ 中)。

Is there any restrictions on the number of files to be referenced, e.g. i can reference file a from file b and reference file b from file c and reference file c from file d, means file d has "imports of c" and file c have "imports of b " and so forth.

没有这样的限制(自然限制除外,显然——即你的内存大小、分配给编译器的内存、你的存储 space、你的文件系统的限制等)。