1

我对 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

4

2 回答 2

2

标准(X.680, 27.3)要求一个SET类型的组件的类型都具有不同的标签。

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

于 2013-10-14T05:23:10.140 回答
1

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

于 2013-10-13T17:58:46.770 回答