我对ASN.1 SET
类型的限制感到困惑。一般来说,我意识到SET
类型与SEQUENCE
基本相同,除了组件的顺序无关紧要。
由Olivier Dubuisson撰写的关于ASN.1的开创性书籍"ASN.1 — Communication Between Heterogeneous Systems",有关SET的说法:
如果SEQUENCE类型的组件顺序无关紧要,则键 - 单词SET用于建模这样的无序结构:
Description ::= SET {
surname IA5String,
first-name IA5String,
age INTEGER }
在这种情况下,应用程序可以提供组件 编码器的最佳顺序。
我立即注意到的是,在Dubuisson的例子中,SET
中有两个 IA5String类型。这似乎与我所读到的here in this tutorial相矛盾,后者明确指出:
SET的类型和值符号类似于SEQUENCE, 除了每个组件的类型必须与所有组件不同 其他人和价值观可以是任何顺序。
那么SET
法律上如何才能拥有两种IA5String
类型?我倾向于相信Olivier Dubuisson关于一些随机互联网教程的书,然而,SET
类型可能有多个相同类型的组件没有任何意义。原因是,在ASN.1中,类型标识符未被编码,(至少对于像BER这样的大多数常见编码),因此解码器无法知道{{1}的哪个组件适用于 - 是IA5String
还是surname
?没有办法判断排序是否无关紧要。
Olivier Dubuisson在这里犯了一个大错? (他在firstname
的冗长描述中也没有提及任何关于SET
不能超过每种类型的事实的任何内容。)
答案 0 :(得分:2)
标准(X.680,27.3)要求SET类型的组件类型都具有不同的标签。
如果封闭的ASN.1模块具有IMPLICIT TAGS或EXPLICIT TAGS(因为组件姓氏和名字的类型具有相同的标签“universal 22”),示例中的“描述”类型违反了此要求,但是如果封闭的ASN.1模块具有AUTOMATIC TAGS是合法的(因为这些组件的类型现在分别具有不同的标签 - “特定于上下文的0”和“特定于上下文的1” - 自动分配给它们以代替它们“通用22”标签)。
答案 1 :(得分:1)
如果SET中有两个具有相同类型的组件,则确实无法区分它们。如果示例出现在具有自动标记的模块中,则该示例仍然可以是正确的。