ASN.1基本语法和编码规则
1 ASN.1 简介
ASN.1 (Abstract Syntax Notation One),抽象语法标记,是描述抽象类型和值的标记,缩写为ASN.1。它用于对通过接口和通信媒体进行传输的信息的抽象描述,广泛应用于各种通信协议的说明中。ASN.1是一个很灵活的标记法,它允许定义众多的数据类型——从整数和位串等简单类型到如集合、序列等的组合结构,还可以是其它复杂定义的类型。
一个ASN.1定义可以选用不同的编码规则,但解码器必须采用和编码器相同的编码规则。目前标准化的编码规则有4个:BER、DER、CER、PER。
BER在19世纪80年代初形成,广泛应用于各种通信协议中,比如SNMP、MHS、TSAPI 等;DER是BER的一种特殊形式,用于对安全性敏感的应用,比如电子商务,要求对一条消息的编码和解码有且只有一条途径;CER是BER 的另一种特殊形式,类似于DER,但它适用于长消息,可以在知道整条消息之前就开始编码,实际中CER很少应用,这是因为工业界把DER作为安全编码的优先方法;PER在上述编码规则之后出现,因它的高效算法而闻名,它的编码速度和压缩程度比BER高,PER适用于带宽资源缺乏的应用,比如空中交通控制和音频—视频通信等。
2 BER的编码规则和传输语法
2.1基本规则
BER(Basic Encoding Rules)是ASN.1中最早定义的编码规则。每种BER 编码方法都由三或四部分组成:
(1)Tag octets:定义了ASN.1值的类和标签值,并指明编码方法是简单化的还是结构化的。
(2)Length octets:对于定长编码方法,它指出了内容octet的个数;对于结构化、非定长编码方法,它指明了长度是不确定的。
(3)V alue octets:对于简单的、定长编码方法,它给出了值的具体表示;对于结构化的方法,它给出了值的内容的BER编码的串联。
(4)End-of-values octets:对于结构化、非定长的编码方法,它表示内容结束;对于其它方法,没有该部分。
BER传输语法的传统格式是TLV三元组<Tag,Length,V alue>格式,见表1。
图1 TLV三元组
TLV每个域都是一系列八位组,对于组合结构,其中V还可以是TLV三元
组,见图2。
图2 传输语法示例
BER传输语法是基于八位组的,自定界的编码,因为其中L明确界定了八位组的长度。BER是大端编码的,其八位组的高位比特在左手边,见图3。
图3 大端编码
2.2 Tag编码
Tag即标签,BER编码中的Tag(通常是一个八位组),指明了值的类型。见图4。除了CHOICE和ANY类型以外,每种ASN.1类型都有一个Tag标签值。Tag标签值可以唯一区分ASN.1类型。Bit7和bit6表示类型;bit5值为0,表示编码方法为简单化的,bit5值为1表示结构化的;Bit4-0给出了具体的标签值。
图4 Tag标签值
比特表征(bit 5)指明是基本类型还是结构化类型(Primitive/Constructed),当结构化类型时,后面的一个V由新的TLV三元组组成。
Tag后5位(bit4-0)的编码:
当Tag不大于30时,Tag只在一个八位组中编码,后5位就表示tag值;
当Tag大于30时,则Tag在多个八位组中编码。在多个八位组中编码时,第一个八位组后五位全部为1,第二个和以后的八位组最高位为1表示后续还有,为0表示Tag结束。第二个和以后的octet给出标签值,Tag的值需要将上图中
黄部分拼接后才能得到。基于128,最高位在先,以便使用尽可能少的数字。见图5。
图5 Tag的具体表示
2.3 Length编码
BER编码中Length表示V alue部分所占八位组的个数,有两大类:定长方式(Definite Form)和不定长方式(Indefinite Form);在定长方式中,按照Length 所占的八位组个数又分为短、长两种形式。见图6。具体如下:
采用定长方式,当长度不大于127个八位组时,Length只在一个八位组中编码,最高位bit7为0,bit6-0表示长度;当长度大于127时,在多个八位组中编码,此时第一个八位组的最高位Bit7为1,后低七位(Bit6-0)表示后面有多少个用于表示实际长度的八位组。第二个和随后的八位组给出实际长度,基于256,高位数字在先。
采用不定长方式时,Length所在八位组固定编码为0x80,但在V alue编码结束后以两个0x00结尾。这种方式使得可以在编码没有完全结束的情况下,可以先发送部分消息给对方。
图6 Length的几种形式
3 Asn.1基本数据类型
ASN.1里定义的每个基本对象都有一个对应的数字标识tag,在进行二进制编码的时候需要使用该标志。
字符串长度的正确表示
4基本语法规则

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。