在 ASN 文件中导入模块时,我们如何获取这些模块或将其设置为导入?

When importing modules in ASN files, how do we get those modules or set it up for import?

我试图将此与 python 联系起来。在 python 中,如果我们正在使用一些与绘图库 matplotlib 相关的命令,它会告诉我们导入 matplotlib 并且我们使用 import statements 来完成它。在 ASN 文件中,我们如何做同样的事情?与此相关的任何资源或指示都会非常有帮助。

IMPORTS 子句用于指示您要引用另一个模块中定义的某些赋值(类型、值等)。 ITU-T X.680 包含所有详细信息。请注意,ASN.1 标准没有说明如何在文件中组织 ASN.1 模块,或者工具应如何定位引用模块的定义(即要查找的文件)——这些留给各个工具决定。

不幸的是,关于模块、IMPORTS 和 EXPORTS 的规则很复杂。下面是一个摘要,参考了 X.680。有关完整语法,请参阅 spec.

模块唯一性

模块名称必须是唯一的 (13.7),但 X.680 预计它们不是唯一的 (13.10)。 OID 应该唯一标识模块 (13.8)。

EXPORTS 报表

EXPORTS语句有3种可能:

  1. EXPORTS 符号已导出“;”
    • 导出所有列出的符号。
    • 您可以将您定义的任何符号导出或导入到当前模块中。导出的名称在(本地)定义和导入的符号中必须是唯一的。
    • 如果列表为空,则不导出任何内容。
  2. 导出所有“;”
    • 导出所有可以显式导出的符号(即唯一名称集)
    • 等同于上面;存在是为了向后兼容

IMPORTS 声明

IMPORTS 语句有两种可能性:

  1. IMPORTS 符号已导入“;”
    • 基本上,您列出要从中导入的模块,以及要为每个模块导入的符号。
    • 如果OID匹配(13.10),此处使用的模块名称可能与模块的声明名称不同。当给出 OID 时,它是确定的 (13.11)。当引用的模块有 OID 时,引用必须使用它 (13.12)。
    • 您导入的符号可能是在引用模块中定义或导入的。如果引用的模块导入符号,它必须是唯一命名的(没有定义或导入超过一次)。
    • 如果引用的模块显式导出符号,则只能导入这些符号。
    • 列出的符号是唯一可以引用为从中导入的模块的外部引用 (module.id) 的符号。
    • 如果 SymbolsImported 为空,则此模块中不能使用外部引用 (module.id)。
    • 可以在没有模块资格的情况下使用导入的符号 (13.19)。但是,在引用时,如果存在任何歧义(符号也在当前模块中定义或多次导入),则必须限定导入符号,否则必须不限定 (13.20)。
  2. 空(无 IMPORTS 语句)
    • 允许外部引用 (module.id)。
    • 提供向后兼容性。

可以按照上面的方法进行引用。如果存在 IMPORTS 语句,则限定引用必须使用 IMPORTS 语句中给出的模块名称(它可以与引用模块中的声明不同,但建议不要这样做)。如果没有 IMPORTS 语句,那么限定引用必须与引用模块中给定的名称相匹配(在这种情况下,OID 显然是无关紧要的)。

在最新的X.680版本(2/21)中,使用OID导入模块时,可以添加WITH SUCCESSORS或WITH DESCENDANTS子句。重点是启用使用 OID 来对模块进行版本控制。基本上,这使得对导入模块的 OID 的某些更改不需要更新任何导入模块的 IMPORTS 语句中的 OID。