0

我需要解码一些很长的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 个,其中一些是构造的,内部也构造了参数。

案例二:

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 更改为 SET,例如:

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

我的意思是,解析只会将这 3 个参数解码为 SET。当然,我必须在接收时修改二进制消息,将其从 SEQUENCE 转换为 SET(仅一位)。但我不能用第一个序列来做到这一点。
有没有办法指示“忽略未知标签”?
我已经阅读了“暗示的可扩展性”,但我不明白这是否是我需要的,或者它只是暗示在序列末尾的可扩展性,就好像我正在使用可扩展性标记“...”一样。

提前致谢,

路易斯

4

1 回答 1

0

尝试摆弄 SEQUENCE 标签以将其更改为 SET 标签是危险的,因为只要序列之间存在非可选组件,序列就可以多次包含相同的标签。SET 无法处理此问题。此外,解码 SET 本质上比以稳健的方式解码 SEQUENCE 更复杂,因为解码器必须能够以任何顺序处理组件。

关于 EXTENSIBILITY IMPLIED,你是正确的,它相当于在每个 SEQUENCE、SET 和 CHOICE 类型的末尾添加 ... 扩展标记,所以我不确定这会对你有所帮助。如果您需要扩展标记的不仅仅是在每个 SEQUENCE 的末尾,那么这可能对您没有用处。

一种替代方法是尝试使用 OSS ASN.1 工具 ( http://www.oss.com ) 的“部分解码”功能,它允许您选择您感兴趣的消息的特定组件并跳过其他组件.

披露:我为 OSS Nokalva, Inc. 工作。

于 2016-03-08T17:24:18.300 回答