1

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

我试图模仿“在 Kaitai Struct 的外部文件中引用枚举”,但它没有用。

我开始研究“导入”,这意味着在外部 ksy 文件中导入 ksy 文件,我将广泛解释我试图做和实现的目标:

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

是否对要引用的文件数量有任何限制,例如我可以从文件 b 中引用文件 a,从文件 c 中引用文件 b,从文件 d 中引用文件 c,这意味着文件 d 具有“c 的导入”并且文件 c 具有“b 的进口”等等。

4

1 回答 1

0

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

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

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

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

将它们分开还有许多其他正当理由,但请注意,Kaitai Struct 拥有多个文件的想法与C ++ 或 Java 不同。鉴于“ksy 文件”中的所有条目都隐式共享相同的_root,那么文件边界分离应该通过这个连接而不是其他规则来评估(如 1 个类 = 1 个文件,如在 Java 中,或 1 个文件 = 1 个编译单元,就像在 C++ 中一样)。

是否对要引用的文件数量有任何限制,例如我可以从文件 b 中引用文件 a,从文件 c 中引用文件 b,从文件 d 中引用文件 c,这意味着文件 d 具有“c 的导入”并且文件 c 具有“b 的进口”等等。

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

于 2020-02-07T09:29:51.193 回答