|
|
3.基本编码规则(Basic Encoding Rules) ASN.1的基本编码规则定义了一种或多种把任意ASN.1值表示成octet string的方法,缩写为BER。(当然还有其它的方法,但是BER是OSI中转换这些值的标准) 使用BER,一个ASN.1的值有三种编码方法,选择哪种取决于值的类型和值的长度是否已知。这三种方法是:基本的,定长编码;结构化的,定长编码;及,结构化的,不定长编码。简单的non-string类型使用第一种(简单、定长编码);结构类型可使用任一种结构化的编码方法;简单的string类型根据值的长度是否已知可使用任一种方法。隐式标签定义的类型可使用下层类型的方法,显式标签定义的类型使用结构化的编码方法。 每种BER编码方法都有三或四部分:
●Identifier octets:定义了ASN.1值的类和标签值,指明编码方法是简单化的还是结构化的。 ●Length octets:对于定长编码方法,它指出了内容octet的个数;对于结构化、非定长编码方法,它指名长度是不确定的。 ●Contents octets:对于简单的、定长编码方法,它给出了值的具体表示;对于结构化的方法,它给出了值的内容的BER编码的串联。 ●End-of-contents octets:对于结构化、非定长的编码方法,它表示内容结束;对于其它方法,没有该部分。 在下面的章节中介绍了这三种编码方法。
3.1、简单定长方法(Primitive, definite-length method) 这种方法用于简单类型及通过对简单类型使用隐式标签生成的类型。它要求值的长度是事先预知的。BER编码的部分定义如下: 1.Identifier octets,有两种形式:较小的标签值(标签值在0和30之间)和较大的标签值(标签值大于等于31)
●Low-tag-number form:一个octet。Bit8和bit7表示类(如表2),bit6值为0,表示编码方法为简单化的。Bit5-1给出了标签值。如下表所示: Class Bit 8 Bit 7 universal 0 0 application 0 1 context-specific 1 0 private 1 1 ●High-tag-number form:两个或多个octet。第一个octet形式如low-tag-number form,但是bit5-1均为1。第二个和以后的octet给出标签值,基于128,最高位在先,以便使用尽可能少的数字,每个octet的bit8都置为1,最后一个为0。 2.Length octets:有两种格式:短型(长度在0至127之间)和长型(长度在0至21008-1之间)
●Short form: 一个octet,bit8为0,bit7-1表示长度。 ●Long form: 2-127个octet。第一个octet的Bit8为1,bit7-1表示后面有多少个用于表示实际长度的octet。第二个和随后的octet给出实际长度,基于256,高位数字在先。 3.Contents octets:给出了值的具体表示(如果类型是由隐式标签定义的,则给出了下层类型的值)特定类型的细节详见第5节。
3.2 结构化定长方法(Constructed, definite-length method) 结构化的、定长方法适用于简单的string类型、结构类型、在二者基础上通过隐式标签生成的类型和在任何类型基础上由显式标签生成的类型。要求值的长度事先已知。BER编码方法各部分如下:
1.Identifier octets:与第3.1节介绍的一样,但bit6的值为1,表示编码方法是结构化的。 2.Length octets:见第3.1节。 3.Contents octets,值的组件的BER编码的串联
●对于简单string类型和在其基础上由隐式标签生成的类型,是值的连续子串的BER编码的串联(隐式标签的下层值) ●对于结构类型和在其基础上由隐式标签生成的类型,是值的组件的BER编码的串联(隐式标签的下层值) ●对于在任何类型基础上使用显式标签生成的类型,是下层值的BER编码特定类型的细节见第5节。
3.3 结构化非定长方法(Constructed, indefinite-length method) 结构化的、非定长编码用于简单string类型、结构类型、在二者基础上使用隐式标签生成的类型和在任何类型基础上使用显式标签生成的类型。不要求事先知道值的长度。BER编码各部分如下:
●Identifier octets,见第3.2节 ●Length octets.一个octet,值为80 ●Contents octets.见第3.2节。 ●End-of-contents octets两个octet,为00 00。 由于end-of-contents octet出现在通常普通BER编码出现的位置(例如,在一个sequence值的内容octet出现的位置),可把00和00分别视为identifier和length octet。因此end-of-contents octet实际上是一个具有universal class,标签值为0,长度为0的值的简单定长编码。
(未完待续) 其余部分参见:
ASN.1/BER/DER编码子集入门指南(一) ASN.1/BER/DER编码子集入门指南(二) |
|