2016-03-07 24 views
0

我需要解碼一些很長的BER消息,並且我有兩種不同的情況。其中一個有幾個強制參數,沒有特定的標籤,還有很多帶有隱式標籤的可選參數。另外只有可選隱含的標籤,例如:帶有未定義標籤的ASN.1 BER序列

案例1:

MySeq ::= SEQUENCE 
{ 
a TYPE1, 
b TYPE1, 
C TYPE1, 
-- first 3 elements have same type 
d IMPLICT [1] TYPEd OPTIONAL, 
e IMPLICT [1] TYPEe OPTIONAL, 

等,多參數,大約40,他們中的一些構造,裏面還構建參數。

案例2:

MySeq ::= SEQUENCE 
{ 
a IMPLICT [1] TYPEa OPTIONAL, 
b IMPLICT [2] TYPEb OPTIONAL, 
c IMPLICT [3] TYPEc OPTIONAL, 
d IMPLICT [4] TYPEd OPTIONAL, 
e IMPLICT [5] TYPEe OPTIONAL, 
etc 

的一點是,我真的需要從這些消息只有3或4個參數。
我不在乎其餘。如果我不需要它,我不希望我的解碼器花費太多的處理時間來解碼完整的消息。有沒有標準的方法來做到這一點?
在我想出了一個主意第二種情況下,對ASN.1定義SEQUENCE從改變設置,如:

MySeq ::= SET 
{ 
a IMPLICT [1] TYPEa OPTIONAL, 
a20 IMPLICT [20] TYPEa OPTIONAL, 
a40 IMPLICT [40] TYPEa OPTIONAL, 
... 
} 

我的意思是,解析只會解碼的3個參數爲一組。當然,我將不得不在接收時修改二進制消息,將其從SEQUENCE轉換爲SET(僅一個位)。但是我不能用第一個SEQUENCE做到這一點。
有什麼方法可以指示「忽略未知標籤」?
我讀過關於「可擴展性隱含」的內容,但是我不明白這是否是我需要的,或者它僅僅意味着在序列結尾的可擴展性,就好像我正在使用可擴展性標記「...」。

由於提前,

路易斯

回答

0

正在嘗試與SEQUENCE標籤,撥弄它更改爲SET標籤是危險的,因爲一個序列可包含只要有一個不相同的標籤多次 - 它們之間的可選組件。 SET不能處理這個問題。而且,解碼SET本質上比以強健的方式解碼SEQUENCE更復雜,因爲解碼器必須能夠以任何順序處理組件。

關於可擴展性暗示,你是正確的,這是加入...擴展標記每個序列的末端相當於,SET和選擇類型,所以我不知道這會幫助你。如果不是每個SEQUENCE的末尾都需要擴展標記,這可能對您沒有用處。

一種替代方法是嘗試使用OSS ASN.1工具(http://www.oss.com)的「部分解碼」功能,該功能允許您選擇您感興趣的消息的特定組件並跳過其他組件。

披露:我爲OSS Nokalva,Inc.工作

+0

嗨,謝謝。 SET中的更改不是一個風險,因爲所有參數都具有不同的隱式標籤,如「Case 2」序列中所示。 無論如何,我正在測試OSS編譯器的「ASN1.DeferDecoding」功能;-) 似乎在這種情況下,我不'關心的所有字段只是編碼爲OpenType,只是一個沒有進一步解碼的緩衝區。我想我正在那樣。 – Kalki70