组件中的自动标签

时间:2018-03-27 07:34:44

标签: asn.1

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

主题25.4有一个明确的说明:

  

这样做的结果是自动标签的应用是   由“ComponentTypeLists”中文本存在的标签抑制,但是   而不是由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

1 个答案:

答案 0 :(得分:2)

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

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

这种隐式标记是使编译器跳过你给" 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不会丢弃您的上下文标记,而是模块的隐式标记。