Encoding ASN.1设置类型限制

Encoding ASN.1设置类型限制,encoding,asn.1,ber,Encoding,Asn.1,Ber,我对ASN.1SET类型的限制感到困惑。一般来说,我意识到集合类型基本上与序列相同,只是组件的顺序无关紧要 奥利维尔·杜布伊森(Olivier Dubuisson)撰写的关于ASN.1的开创性著作中有这样一句话: 如果序列类型的组件顺序无关紧要,则键- 单词集用于对此类非有序结构进行建模: 在这种情况下,应用程序可以向 编码器的最佳顺序 我在这里立即注意到的是,在Dubuisson的示例中,SET中有两种IA5String类型。这似乎与我读到的内容相矛盾,其中明确指出: 集合的类型和值符号与序

我对ASN.1
SET
类型的限制感到困惑。一般来说,我意识到
集合
类型基本上与
序列
相同,只是组件的顺序无关紧要

奥利维尔·杜布伊森(Olivier Dubuisson)撰写的关于ASN.1的开创性著作中有这样一句话:

如果序列类型的组件顺序无关紧要,则键- 单词集用于对此类非有序结构进行建模:

在这种情况下,应用程序可以向 编码器的最佳顺序


我在这里立即注意到的是,在Dubuisson的示例中,
SET
中有两种IA5String类型。这似乎与我读到的内容相矛盾,其中明确指出:

集合的类型和值符号与序列类似, 除了每个组件的类型必须与所有组件不同之外 其他值和值可以是任意顺序

那么,一个
集合如何合法地拥有两种
IA5String
类型呢?我倾向于相信Olivier Dubuisson的书,而不是一些随机的互联网教程,然而,
SET
类型可以有多个相同类型的组件是没有任何意义的。原因是,在ASN.1中,类型标识符没有编码(至少对于大多数常见的编码,如BER),因此解码器无法知道
IA5String
应用于哪个组件-是
姓氏
还是
名字
?没有办法判断订单是否重要


那么Olivier Dubuisson是不是犯了个大错误?(他在对
SET
类型的长篇描述中也没有提到
SET
每个类型不能超过一个的事实。)

如果一个集合中有两个相同类型的组件,它们确实无法区分。如果该示例出现在具有自动标记的模块中,则该示例仍然是正确的

标准(X.680,27.3)要求集合类型的组件类型都有不同的标签

如果封装的ASN.1模块具有隐式标记或显式标记(因为组件的姓氏和名字的类型具有相同的标记“universal 22”),则示例中的“Description”类型违反此要求,但如果封装的ASN.1模块具有自动标记,则该类型是合法的(因为这些组件的类型现在有不同的标记--“上下文特定的0”和“上下文特定的1”,分别自动分配给它们,以替换“universal 22”标记)

 Description ::= SET {    
   surname IA5String,   
   first-name IA5String,  
   age INTEGER  }