我有一个关于显式和隐式标记的问题,在以下示例中
X ::= [APPLICATION 5] IMPLICIT INTEGER
X
,因为隐式标记会将INTEGER
上的现有标记替换为[APPLICATION 5]
,因此值为5的BER编码将为十六进制45 01 05
。解码器如何知道45 01 05
的类型?
答案 0 :(得分:0)
解码器从八位字节流恢复原始类型的唯一方法是知道它即将到来。 AFAIK,你的解码器应该给出一个暗示在给定环境下期望的类型,最重要的是,暗示了隐式标记类型映射的ASN.1类型。
考虑结帐this book。
答案 1 :(得分:0)
我怀疑你真正的问题是,"当使用隐式标签时,BER解码器如何知道该怎么做?这些标签会替换那些标志着需要解码的ASN.1类型的标签?& #34;
解码器是否可以处理IMPLICIT标签取决于解码器是否通过ASN.1规范通知,ASN.1规范提供了必要的上下文。对SEQUENCE,SET和CHOICE的组件有强制要求,以确保解码器可以读取标签并知道哪个组件需要解码,因此,类型是什么。这需要了解ASN.1规范。
相比之下,没有ASN.1规范通知的通用BER解码器会出现隐式标签的问题,因为它没有必要的上下文来解释它们。
答案 2 :(得分:0)
通常,BER解码器由ASN.1编译器基于给定的规范(模式)生成。然后,在解码期间,除了输入的编码数据之外,用户还将指定他们想要解码的类型。使用类型信息,解码器将知道要解码的内容。
答案 3 :(得分:0)
首先,我已经写了一本关于异构系统之间的ASN.1通信的书#34;发送给我 Ilya Etingof 的内容,以下是更多详细信息:
" IMPLICIT标记按如下方式进行:通过类型引用明确提及或间接到达的所有以下标记将被忽略直到下一次出现(包含)UNIVERSAL类标记(除非之前遇到过EXPLICIT标记)。所以,对于下面的T型:
T :: = [1] IMPLICIT T1
T1 :: = [5] IMPLICIT T2 *
T2 :: = [APPLICATION 0] IMPLICIT INTEGER
只应编码标签[1]。另一种解释概念的方式 隐式标记的意思是说标记为IMPLICIT的标记会被覆盖 跟随它的标签(递归);因此,对于上面的例子,tag [1]会覆盖tag [5],而tag [5]会覆盖tag [APPLICATION 0]。 最后覆盖INTEGER 类型的默认标签 [UNIVERSAL 2]。
只有在接收时才能解码以隐式模式标记的类型 应用程序“知道'抽象语法,即解码器 从与编码器相同的ASN.1模块生成(等等) 大部分时间都是如此。"
所以我认为在数据传输开始时,应该在演示文稿中对(ASN1规范)进行解释。