Post

ASN.1编码规则

ASN.1规则中数据的表示方法以及各数据类型的描述

ASN.1编码规则

ASN.1

BER(BasicEncoding Rules)是 ASN.1 中最早定义的编码规则,其他编码规则是在 BER 的基础上添加新的规则构成。

BER 传输语法是基于八位组大端编码的,高八位在左。

BER 传输语法的格式一直是 TLV 三元组

TagLengthValue
类型Value 的长度

Tag

Tag 是一个或若干个八位组
目前我遇到的都只有一个八位组,所以一下仅写 universalTag 类型

7654~0
000/10~30

7、6 位指明 Tag 的类型,00 表示 UniversalTag 类型;
5 位指明该类型以 primitive 方式编码还是 constructed 方式编码;
因此 SEQUENCE、SET 类型 Tag 对应 16(0x10)、17(0x11)将编码为 0x30、0x31
4~0 位指明对应的 UniversalTag 类型(值是 0-30):注意这里的 30 是十进制。

ASN.1 中定义的 UNIVERSAL 类 Tag

Tag16 进制编码类型
00x00BER 保留
10x01BOOLEAN
20x02INTEGER
30x03BIT STRING
40x04OCTET STRING
50x05NULL
60x06OBJECT IDENTIFIER
70x07ObjectDescripion
80x08EXTERNAL,INSTANCE OF
90x09REAL
100x0AENUMERATED
110x0BEMBEDDED PDV
120x0CUFT8String
130x0DRELATIVE-OID
140x0E保留
150x0F保留
160x30SEQUENCE,SEQUENCE OF
170x31SET,SET OF
180x12NumericString
190x13PrintableString
200x14TeletexString,T61String
210x15VideotexString
220x16IA5String
230x17UTCTime
240x18GeneralizedTime
250x19GraphicString
260x1AVisibleString,ISO646String
270x1BGeneralString
280x1CUniversalString
290x1DCHARACTER STRING
300x1EBMPString
310x1F保留

Length

BER 编码中 Length 表示 Value 部分所占八位组的个数
有两大类:定长方式(DefiniteForm)和不定长方式(IndefiniteForm)

定长方式

定长方式中,按长度是否超过 127(则 7 个位的存储范围),分为短、长两种形式(则用第 8 位来区分):

实际长度TagLength4LengthLengthValue
0~127TagNULL0x00~0x7FValue
128~256^126-1Tag0x80+nn 个 LengthValue

判断方式:第一个 Length 的最高位是否为 1
Example:
Length(1196==0x04AC)

Length4LengthLength
0x820x04 0xAC

不定长方式

TagLengthValueEnd
Tag0x80Value0x00 0x00

Length 所在八位组固定编码为 0x80,但在 Value 编码结束后以两个 0x00 结尾。这种方式使得可以在编码没有完全结束的情况下,可以先发送部分消息给对方。

This post is licensed under CC BY 4.0 by the author.