原创 ASN.1学习笔记

2008-8-28 15:28 9117 17 18 分类: 通信

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,难免有疏漏和错误,还请各位给予指正,同时也欢迎大家互相交流学习。
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2014-5-20 17:38

0011 0000 0000 1010 0001 0110 0000 0011 0100 1010 0110 1111 0110 1000 0110 1110 0000 0010 0000 0010 0000 0000 1000 0001 第四字节尾部是表示长度吧?值是不是有问题?应该是4吧。

相关推荐阅读
用户741296 2008-10-08 10:31
在搞51跑TCP/IP的东西……
    换了工作,也换了城市。    在这个公司,开始着手整51跑TCP/IP的东西,感觉好费劲!但必须整,这对自己也是个提高啊!     以后在ARM中也会用到TCP这一块,不如提前整整,先给后面最...
用户741296 2008-07-16 16:26
辞职了!哈哈……
 辞职了!这是最后一次以这家公司员工的身份这里发帖。心里轻松许多……虽然辞职了,但心里是非常喜悦的!离开了这个让自己心里非常不爽的公司。但有一点不可否认,就是我在这里学到了很多。我不是忘恩负义,只是这...
用户741296 2008-04-11 15:00
这个项目终于接近尾声了!
    又是很久沒有發日誌了!    主要是由於這段時間忙著趕一個項目。終於算是接近尾聲了,因為現在正在測試,肯定後面還有一些工作要做。    這個項目其實也沒有什麽,通過雙串口實現上下行的通訊連接,...
用户741296 2008-02-29 15:54
好久没有写东西了!
    好久没有在这里写东西了,想写点什么。那就汇总一下近来的工作吧!    年前一段时间一直在整SD卡的相关工作,其实很早一段时间就开始整了,只是没有东西才没有及时动手,但一直在研究相关资料。所以,...
用户741296 2008-01-02 10:59
崭新的2008已经开始!
    崭新的2008已经开始!    在2008,世界瞩目中国。2008是属于中国的!北京奥运会,将会把中国带向世界,也会把世界带回中国。    让我们在2008,让中国在2008,展现自我,展现辉...
我要评论
1
17
关闭 站长推荐上一条 /3 下一条