asn.1 学习笔记

ASN.1即抽象语法符号,用来定义应用程序数据和表示协议数据单元的抽象语言。优点是独立于机器、语言及应用程序的内部表示。适用于描述现代通信中复杂的、变化的、可扩展的数据结构。比如3G和VoIP均采用了ASN.1。

      ASN.1分两大部分:语法规则和编码规则。

语法规则

1. ASN.1定义示例

Age  ::= INTEGER (0..120)

User ::= SEQUENCE {

         name    IA5String (SIZE(1..128)),

         age     Age DEFAULT 18,

         address  IA5String OPTIONAL,

         ...

       }

 

2. 简单类型

基本类型

字符串类型

对象类型

其它类型

 

3. 构造类型

SEQUENCE,对应于C语言中的struct

SEQUENCE OF,对应于数组

SET,类似于SEQUENCE,但不考虑分量顺序

SET OF,集合类型,每一分量类型相同,不考虑顺序

 

4. 类型定义

语法:   typereference ::= Type

示例:

1) Counter      ::= INTEGER

2) UserAccount ::= SEQUENCE {

    username PrintableString,

    password PrintableString,

    account INTEGER

}

 

5. 赋值

语法: valuereference Type ::= Value

示例:

1) current Counter  ::= 1234

2) myAccount UserAccount ::= {

    username “tly”,

    password “guesswhat”,

    account 2345

}

编码规则

1. BER

1) 三种情况及其格式:

a.简单类型(Primitive),定长;

Identifier  |  Length  |  Content

b.构造类型(Constructed),定长;

Identifier  |  Length  |  I | L | C | I | L | C | ...

c.构造类型(Constructed),不定长;

Identifier  |  Length  |  I | L | C | I | L | C | EOC|

 

2) Identifier编码

格式:   8     7     6     5    4    3    2    1

            Class    | P/C |     Tag    number

分两种情况:

a.Tag number < 31

b.Tag number >= 31

 

3) Length及Content编码

分三种情况:

a.短形(L < 128),定长

b.长形(L >= 128),定长

c.不定长,仅用于构造类型

 

4) 示例

a.INTEGER 49

0000 0010   0000 0001   0011 0001

 

b.UserAccount ::= SEQUENCE {

    username IA5String,

    account INTEGER

}

myAccount UserAccount ::= {

    username “john”,

    account 129

}

 

0011 0000  0000 1010

0001 0110  0000 0011

0100 1010  0110 1111

0110 1000  0110 1110

0000 0010  0000 0010

0000 0000  1000 0001

 

2. DER

为确保编码的唯一性,出现了CER和DER两种编码方案,它们均为BER子集。其中DER只使用定长编码,CER基于不定长编码。

 

3. PER

在PER中,tag从不传送,length和value如果双方都知道,也不需传送。因此,其编码更精简,效率更高。

1) 格式

preamble  |   length   |  contents

preamble:只出现在ENUMERATED、SEQUENCE、SET、CHOICE四种数据结构的编码中。用来记录结构中有无扩展项(extension)、选择项(optional)或缺省项(default);

length: 对STRING、SEQUENCE OF、SET OF等数据类型进行编码时,需对其长度按对齐方式进行编码;

contents:若数据是基本结构类型,如:BOOLEAN、INTERGER、REAL、BITSTRING等,即可直接进行编码;若数据是复合结构类型,如 SEQUENCE、SET、CHOICE、SEQUENCE  OF 等,则属嵌套编码,此时contents中也包含有preamble、length、contents三个部分。

 

2) 示例

a. cug-Index  INTEGER(1..256)的值为10时,PER编码为(pad)00001001

b. error  CHOICE

{

  systemErr   NULL,

  operationErr  NULL,

  …

}

      若error值为systemErr,则PER编码为00。

 

4. XER

即XML Encoding Rules,主要应用于网站开发,本文不作介绍。

 

结束语:

      本文介绍了抽象语法符号1(ASN.1)的概念和数据表示方式,对BER编码过程给出了较详细的说明和示例,同时也简要地介绍了ASN.1的其它编码方法,如DER, PER, XER等。最近因学习3GPP之故,本人刚刚接触ASN.1,难免有疏漏和错误,还请各位给予指正,同时也欢迎大家互相交流学习。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章