ANS1编码详解(二)--编码规则

来源:互联网 发布:手机淘宝开店 编辑:程序博客网 时间:2024/06/05 17:02

基本编码规则(BasicEncodingRules)ASN.1的基本编码规则定义了一种或多种把任意ASN.1
值表示成字节字符串的方法,缩写为BER。(当然还有其它的方法,但是BER是OSI中转换这些值的标准)
使用BER,一个ASN.1的值有三种编码方法,选择哪种取决于值的类型和值的长度是否已知。这三种方法是:简单定长编码,结构化定长编码,及结构化不定长编码。简单的non-string类型使用第一种(简单定长编码);结构化类型可使用任一种结构化的编码方法;简单的string类型根据值的长度是否已知可使用任一
种方法。隐式标签定义的类型可使用下层类型的方法,显式标签定义的类型使用结构化的编码方法。每种BER编码方法都有三或四部分:
Identifier octets(以下简称_Id):定义了ASN.1值的类和标签值,指明编码方法是简单的还是结构化的。(这个就相当于tlv格式的tag)
Length octets(以下简称_Length):对于定长编码方法,它指出了内容字节个数;对于结构化非定长编码方法,它指明长度是不确定的。(这个就相当于tlv格式的length)
Contents octets(以下简称_Content):对于简单定长编码方法,它给出了值的具体表示;对于结构化的方法,它给出了值内容的BER编码的串联。(这个就相当于tlv格式的value)
End-of-contents pctets (以下简称_End):对于结构化非定长的编码方法,它表示内容结束;对于其它方法,没有该部分。
在下面的章节中介绍了这三种编码方法。(这个是结束符号)

一、简单定长编码
_Id有两种形式,一种是<=30的(Low-tag-num ),第二种是>30的(high-tag-num)
_Id第一个字节的bit8和bit7位表示类:
0 0 :universial
0 1:application
1 0:context-specific
1 1:private
bit6为0 表示简单编码

low-tag-num:bit5-bit1表示_Id值
high-tag-num: 大端法表示,第一个字节bit5-bit1全部置1,其余每个字节bit8置1其余位表示_Id值,最后一位bit8为0表示结束
例如 通用的简单编码类型9(Low-tag-num) 和 42、129(high-tag-num)
9的bit表示: {00001001}
42的bit表示:{00011111}{000101010}
129的bit表示 {00011111}{11000000}{00000001}

_Length:有两种表示方式,一种是短类型(Short form)一种是长类型(Long form),以128为界限。
短类型:bit8为0,其余位表示长度
长类型:第一个字节bit8为1,其余位表示长度的字节数,随后的字节给出长度
例如:20 和200
20的bit表示:{00010100}
200的bit表示:{10000001}{11001000}

_Contents:具体的内容,这个后面再说

3.2 结构化定长方法( Constructed, definite-length method)
结构化定长方法适用于简单的 string 类型、 结构类型、 在二者基础上通过隐式标签生成
的类型和在任何类型基础上由显式标签生成的类型。 要求值的长度事先已知。 BER 编码方
法各部分如下:
_Id:同简单编码,不过第一个字节的bit6为1
_length:同简单编码
Contents:值的组件的 BER 编码的串联
对于简单string类型和在其基础上由隐式标签生成的类型, 是值的连续子串的BER编码的串联(隐式标签的下层值);
对于结构类型和在其基础上由隐式标签生成的类型, 是值的组件的BER编码的串联(隐式标签的下层值);
对于在任何类型基础上使用显式标签生成的类型,是下层值的BER编码。
具体的以后再说

3.3结构化非定长方法( Constructed, indefinite-length method)
结构化的、 非定长编码用于简单 string 类型、 结构类型、 在二者基础上使用隐式标签生成的类型和在任何类型基础上使用显式标签生成的类型。不要求事先知道值的长度。 BER编码各部分如下:
Identifier octets, 见第 3.2 节
Length octets.一个字节,值为 80
Contents octets.见第 3.2 节。
End-of-contents octets 两个字节,为 00 00。

0 0
原创粉丝点击