我对 ASN.1SET
类型的限制感到困惑。一般来说,我意识到 aSET
类型与 a 基本相同SEQUENCE
,除了组件的顺序无关紧要。
Olivier Dubuisson撰写的关于 ASN.1 的开创性著作“ ASN.1 — 异构系统之间的通信”对 SET 有这样的说法:
如果 SEQUENCE 类型的组件顺序无关紧要,则使用关键字 SET 来建模这种无序结构:
Description ::= SET {
surname IA5String,
first-name IA5String,
age INTEGER }
在这种情况下,应用程序可以按最佳顺序向编码器提供组件。
我在这里立即注意到的是,在 Dubuisson 的示例中,其中SET
有两个IA5String 类型。这似乎与我在本教程中读到的内容相矛盾,其中明确指出:
SET 的类型和值表示法与 SEQUENCE 类似,只是每个组件的类型必须与所有其他组件不同,并且值可以按任何顺序排列。
SET
那么一个法律上怎么可能有两种IA5String
类型呢?我倾向于相信 Olivier Dubuisson 的书而不是一些随机的 Internet 教程,但是,一个SET
类型可以有多个相同类型的组件没有任何意义。原因是,在 ASN.1 中,类型标识符没有被编码,(至少对于最常见的编码,如 BER),所以解码器无法知道IA5String
适用于哪个组件 - 是它surname
还是firstname
?没有办法判断顺序是否无关紧要。
那么奥利维尔杜比松在这里犯了一个巨大的错误吗?(在他对类型的冗长描述中,他也没有提到任何关于 a不能有超过一种SET
类型的事实。)SET