2013-10-13 107 views
1

我對ASN.1 SET類型的限制感到困惑。一般來說,我意識到SET類型基本上與SEQUENCE相同,只是組件的順序無關緊要。ASN.1 SET類型限制

開創性的書ASN.1,"ASN.1 — Communication Between Heterogeneous Systems"由Olivier Dubuisson,有這樣說集:

如果序列類型的組件順序並不重要,該密鑰 - 詞集使用用於建模這樣的非有序結構:

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

在這種情況下,應用程序可以提供組件到 ENC或者按照最佳順序排列。


我立刻注意到這裏的是,在Dubuisson的例子中,SET有它IA5String類型。這似乎矛盾的時候,我讀過here in this tutorial,其中明確表示,:

的類型和價值符號的設置類似於SEQUENCE, 除了類型的每個組件都必須是不同的所有 其他人和價值觀可以以任何順序。

那麼SET如何合法有兩個IA5String類型?我傾向於相信Olivier Dubuisson的一本隨機互聯網教程的書,但是,SET類型可能有多個相同類型的組件,這沒有任何意義。原因在於,在ASN.1中,類型標識符沒有被編碼爲(至少對於諸如BER的大多數常見編碼),因此解碼器將無法知道IA5String適用於哪個組件 - 它是surname還是firstname ?沒有辦法知道排序是否無關緊要。

Olivier Dubuisson在這裏犯了一個大錯誤嗎? (他在SET類型的漫長描述中也沒有提及任何關於SET不能具有多於一種類型的事實的任何地方)。

回答

1

如果在SET中有兩個相同類型的組件,他們確實無法區分。如果該示例出現在具有自動標記的模塊中,該示例仍然可以正確。

2

標準(X.680,27.3)要求SET類型組件的類型都有不同的標籤。

如果封裝的ASN.1模塊具有IMPLICIT TAGS或EXPLICIT TAGS(因爲組件surname和first-name的類型具有相同的標籤「universal 22」),示例中的「Description」類型違反了該要求,但如果封裝的ASN.1模塊具有自動標籤(因爲這些組件的類型現在分別具有不同的標籤 - 「特定於上下文的0」和「特定於上下文的1」) - 自動分配給它們替代的「通用22」標籤)。