组件中的自动标记

AUTOMATIC TAGS in COMPONENTS OF

阅读 https://www.itu.int/rec/T-REC-X.680-201508-I,我想知道如何在 AUTOMATIC TAGS 上下文中标记使用 COMPONENTS OF 插入的组件。

题目25.4有明确说明:

The effect of this is that the application of automatic tags is suppressed by tags textually present in the "ComponentTypeLists", but not by tags present in the "Type" following COMPONENTS OF.

因此,逻辑告诉我,如果在 COMPONENTS OF 类型的组件中找到某些标签,则在转换期间不会复制它们。

确实,如果我在 http://asn1-playground.oss.com/ 上尝试这个 ...

ModuleA DEFINITIONS AUTOMATIC TAGS ::=

BEGIN

A ::= SEQUENCE {
    a   INTEGER,
    COMPONENTS OF B,
    b   INTEGER
}

B::= SEQUENCE  {
    c   REAL,
    d   [1] INTEGER,
    e   REAL
}

END

我明白了...

Encoding to the file 'data.ber' using BER encoding rule...
A SEQUENCE: tag = [UNIVERSAL 16] constructed; length = 17
  a INTEGER: tag = [0] primitive; length = 1
    1
  c REAL: tag = [1] primitive; length = 2
    "1"
  d INTEGER: tag = [2] primitive; length = 1
    1
  e REAL: tag = [3] primitive; length = 2
    "1"
  b INTEGER: tag = [4] primitive; length = 1
    1

我的问题是:在 https://www.itu.int/rec/T-REC-X.680-201508-I 中实际上写的是在转换中删除了 COMPONENTS OF 类型的标签?

我只能看到扩展和子类型约束被删除了。

我只能看到,在 2004 年,有人似乎弄错了:http://lists.asn1.org/pipermail/asn1/2005-July/000285.html

标准规定,当模块具有自动标记并且序列等是自动标记的候选对象时,编译器将为每个字段添加一个虚拟上下文标记。

该标准还规定,当模块具有自动标签时,也意味着它具有隐式标签。

这种隐式标记使编译器跳过您给 "d" 字段的标记。

因此,为了清楚起见,如果我们手动展开组件和自动标签,那么您的示例将变为:

ModuleA DEFINITIONS AUTOMATIC TAGS ::=

BEGIN

A ::= SEQUENCE {
    a   [0]INTEGER,
    c   [1]REAL,
    d   [2][1] INTEGER,
    e   [3]REAL,
    b   [4]INTEGER
}

B::= SEQUENCE  {
    c   REAL,
    d   [1] INTEGER,
    e   REAL
}

END

因此,不是 COMPONENTS OF 正在删除您的上下文标记,而是模块的隐式标记。