阅读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
答案 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不会丢弃您的上下文标记,而是模块的隐式标记。