ASN.1 SET类型限制

时间:2013-10-13 16:29:52

标签: encoding asn.1 ber

我对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不能超过每种类型的事实的任何内容。)

2 个答案:

答案 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中有两个具有相同类型的组件,则确实无法区分它们。如果示例出现在具有自动标记的模块中,则该示例仍然可以是正确的。