BER 编码解码规范与事例
1.1.1 概述
BER(Basic Encoding Rules)是ASN.1中最早定义的编码规则,在讨论详细编码规则时,我们是基于正确的抽象描述上。BER传输语法的格式一直是TLV三元组<Type, Length, Value>也可以认为是<Tag, Length, Value>,见Figure 3-1。TLV每个域都是一系列八位组,对于组合结构,其中V还可以是TLV三元组,见Figure 3-2。BER传输语法是基于八位组(为了避免不同系统上的混淆,没有采用Byte为单位)的,自定界的编码,因为其中L明确界定了八位组的长度。BER是大端编码的,其八位组的高位比特在左边。
Figure 3-1 TLV三元组
Figure 3-2 传输语法示例
Figure 3-3 大端编码
1.1.2 BER编码中Identifier(Tag)
BER编码中的Tag(通常是一个八位组),指明了值的类型,其中一个比特表征是基本类型还是组合类型。Tag有如下两种形式:
Figure 3-4 Tag的两种形式
当Tag不大于30时,Tag只在一个八位组中编码;当Tag大于30时,则Tag在多个八位组中编码。在多个八位组中编码时,第一个八位组后五位全部为1,其余的八位组最高位为1表示后续还有,为0表示Tag结束。Tag的值需要将上图中黄色部分拼接后才能得到。
1.1.3 BER编码中Length
BER编码中Length表示Value部分所占八位组的个数,有两大类:定长方式(Definite Form)和不定长方式(Indefinite Form);在确定方式中,按照Length所占的八位组个数又分为短、长两种形式。具体如下:
Figure 3-5 Length的三种形式
采用定长方式,当长度不大于127个八位组时,Length只在一个八位组中编码;当长度大于127时,在多个八位组中编码,此时第一个八位组低七位表示的是Length所占的长度,后续八位组表示Value的长度。
采用不定长方式时,Length所在八位组固定编码为0x80,但在Value编码结束后以两个0x00结尾。这种方式使得可以在编码没有完全结束的情况下,可以先发送部分消息给对方。
BER编码规则的Object Identifier注册为{joint-iso-itu-t(2) asn1(1) base-encoding(1)},其Object Description为“"Basic Encoding of a single ASN.1 type”。
1.1.4 各类型的编码
本小节中以UNIVERSAL Tag和短型Value为例,讨论各种类型的BER编码,重点关注Value部分。在举例中,n10表示数字n是十进制数。
I. BOOLEAN
只能以primitive方式编码。
FALSE的编码为:
Figure 3-6 BOOLEAN: FALSE的编码
TRUE的编码(任何不是全0都可以)为:
或者:
Figure 3-7 BOOLEAN: TRUE的编码
II. NULL
只能以primitive方式编码,且只有一个值: