BER编码规约
BER(Basic Encoding Rules)是ASN.1中最早定义的编码规则,其他编码规则是在BER的基础上添加新的规则构成
1.BER传输语法的格式是TLV三元组<Tag,Length,Value>
2.BER传输语法是基于八位组大端编码的,(没有采用Byte为单位说是为了避免不同系统上的混淆),所谓的的基于八位组大端编码就是说八位组中高位的在左,
3.Tag是一个或若干个八位组
①UniversalTag类型(值在0~30)
这时候用一个八位组描述Tag,第七、六位指明Tag的类型,UniversalTag类型用00表示(01表示APPLICATION,10表示CONTEXT-SPECIFIC,11表示PRIVATE),第五位指明该类型以primitive方式编码(值为0,表示原始方式)还是constructed方式编码(值为1,表示结构方式即TLV中的value也用TLV表示)4~0位表示类型值,
例如INTEGER的Tag值是12,tag类型是UniversalTag,Integer只能用primitive编码,则Tag从左到右8位组为00000010
其他UniversalTag类型值类型对应如下
Tag |
类型 |
0 |
BER保留 |
1 |
BOOLEAN |
2 |
INTEGER |
3 |
BIT STRING |
4 |
OCTET STRING |
5 |
NULL |
6 |
OBJECT IDENTIFIER |
7 |
ObjectDescripion |
8 |
EXTERNAL,INSTANCE OF |
9 |
REAL |
10 |
ENUMERATED |
11 |
EMBEDDED PDV |
12 |
UFT8String |
13 |
RELATIVE-OID |
14 |
保留 |
15 |
保留 |
16 |
SEQUENCE,SEQUENCE OF |
17 |
SET,SET OF |
18 |
NumericString |
19 |
PrintableString |
20 |
TeletexString,T61String |
21 |
VideotexString |
22 |
IA5String |
23 |
UTCTime |
24 |
GeneralizedTime |
25 |
GraphicString |
26 |
VisibleString,ISO646String |
27 |
GeneralString |
28 |
UniversalString |
29 |
CHARACTER STRING |
30 |
BMPString |
31 |
保留 |
②当Tag大于30时,多个八位组编码中,第一个八位后五位为1,其余八位组最高位为1表示后续还有,为0表示Tag结束,其余是值
4.Length表示Value部分所占八位组个数,有两种方式表示:定长方式和不定长方式
①定长方式按value的实际长度值是否超过127又分为短、长两种形式:
短:使用一个八位组,第七位为0,后七位是值则为0xxxxxxx,可知最大值为127
长:使用多个八位组,第一个八位组第七位为1,表示长形式,后七位表示后面还有多少个八位组属于length。比如value长度是169,则length为1000 0001 1010 1001
②不定长方式
length只有一个八位组固定为0x80,但是在value编码结束后以两个0x00结尾。
关于value的细节参考http://blog.****.net/sever2012/article/details/7698297