首页 > 范文大全 > 正文

ASN.1解码器的设计与实现及其在3G中的应用

开篇:润墨网以专业的文秘视角,为您筛选了一篇ASN.1解码器的设计与实现及其在3G中的应用范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

【摘要】文章首先解析了asn.1协议的语法和特点,然后针对BER编解码进行了深入探讨,并提出了基于BER编码结构的解码器设计思路,最后给出了3g中ASN.1 BER编码方式话单解码器的应用示例。

【关键词】ASN.1 BER 编解码 3G话单

1 引言

在3G移动通信迅速发展的今天,信息的多样化、复杂化对网络信息传送提出了越来越高的要求,3G通信标准中大量运用了ASN.1(Abstract Syntax Notation One,抽象语法记法1)标准的数据流传递和记录规范,尤其是在话单生成、信令编码等领域。若要深入研究3G网络中的信息传送和处理,了解和掌握ASN.1标准是非常必要的。

ASN.1作为ISO/ITU-T标准,描述了对数据进行表示、编码、传输和解码的数据格式,完全独立于机器、语言和应用程序,任何以数字方式发送的信息(音频、视频、文本、数据等)都可以用ASN.1语法进行数据编解码,完成数据传送。ASN.1更适合现代移动通信中结构化的、复杂的、变化的及可扩展的数据结构。

2 ASN.1的语法结构

ASN.1用两部分描述信息:一部分描述信息内数据、数据类型及序列格式,称为“语法规则”;另一部分描述如何将各部分组成消息,即如何编码实际消息中的数据,称为“编码规则”。

ASN.1共有四种类型:

(1)简单类型,基本数据单元,没有下层组件;

(2)结构类型,具有组成部分;

(3)标签类型,由其它类型生成;

(4)其它类型,包括CHOICE和ANY类型。

可以使用ASN.1的分配符(::=)给类型和值指定名字,这些名字可以用于定义其它类型或值。ASN.1模块格式如图1所示:

3 BER基本编码规则

ASN.1的基本编码规则定义了一种或多种把任意ASN.1值表示成字节字符串的方法,按值的类型和长度是否已知,可分为三种编码方法:简单定长编码、结构化定长编码和结构化不定长编码。

每种BER编码方法都有三或四个部分:

Identifier octets:定义了ASN.1值的类和标签值,指明编码方法是简单的还是结构化的。

Length octets:对于定长编码方法,它指出了内容字节个数;对于结构化非定长编码方法,它指明长度是不确定的。

Contents octets:对于简单定长编码方法,它给出了值的具体表示;对于结构化的方法,它给出了值内容的BER编码的串联。

End-of-contents octets:对于结构化非定长的编码方法,它表示内容结束;对于其它方法,没有该部分。

下面进一步说明BER中Identifier octets、Length octets、Contents octets和End-of-contents octets的定义及结构。

(1)Identifier octets

该字段分为两种类型,较小的标签值(标签值=0~30)和较大的标签值(标签值≥31)。

较小的标签值由一个字节构成,如图3所示,bit8和bit7表示类;bit6表示是否为结构化,0表示编码方法是简单化的,1表示是结构化的;bit5~1给出了标签值。

较大的标签值由两个或多个字节组成,结构见图4。第一个字节形式如较小标签值字节结构,但是bit5~1均为1;第二个和以后的字节给出标签值,基于128,最高位在前,以便使用尽可能少的数字,除了最后一个字节以外,每个字节的bit8都置为1,最后一个字节的为0。

(2)Length octets

Length octets分为三种格式:短型(长度在0至127之间)、长型(长度在128至(21008-1)之间)和不定长型。

短型:由一个字节构成,bit8为0,bit7~1表示长度。

长型:由2~127个字节构成。第一个字节的bit8为1,bit7~1表示后面有多少个用于表示实际长度的字节。第二个和随后的字节给出实际长度,基于256,高位数字在先。

不定长型:由一个字节构成,值为0x80(十进制为128)。

三种类型的具体结构如图5所示。

(3)Contents octets

若为简单类型结构,该部分直接给出了值的具体表示;对于结构类型和在其基础上由隐式标签生成的类型,是值组件BER编码的串联(隐式标签的下层值);对于在任何类型基础上使用显式标签生成的类型,是下层值的BER编码。

(4)End-of-contents octets

对于结构化非定长的编码方法,它表示内容结束,用两个字节表示,取值为00 00;对于其它方法,没有该部分。

根据以上介绍,我们可以用各种语言编写构建解码器来处理3G通信网中的信息。下面以笔者编写的软交换话单分析器解码用ASN.1 BER格式编码的二进制软交换3G话单为例,说明ASN.1解码器在3G网络中的应用。

4 ASN.1 BER解码程序设计思路

根据BER编码语法特点,读取二进制数据后,最终解码出的是一层层的标签值和对应的内容,因此解码器的设计首先要构建好存放ASN标签和内容的容器。然后再将读取的二进制数据根据BER语法进行判断,以决定是否需要进一步解析标签和数据内容,直至到达最底层的标签为止,这时要用到递归调用。在解析完每一层标签的同时,获取该层标签和数值,并存放于ASN容器当中。具体思路如下:

(1)首先创建一个ASN数据结构,由标签和内容两部分组成。

(2)然后创建一个byte类型的数组,并把整段二进制文件读入数组。

(3)读取数组中的首个字节,根据bit6判断标签类型是否为结构化,0表示简单化,1表示结构化。

若为简单化标签,则直接获取首字节的bit5~1作为标签数值。

若为结构化标签,则读取第二个和后续字节,直到后续字节的bit8为0为止,基于128,从第二个和后续字节获取标签数值;然后递归调用本方法,直到读取到最底层,标签变为简单化为止。

(4)获取完当前标签值后,用“-”与上层标签文本合并,明确表示出标签值和层级关系,如“A6-A7-80”的形式;接着向下读取表示内容长度的字节,由该字节的bit8判断长度字节是短型还是长型,0表示短型,1表示长型。

若为短型结构,则直接从该字节的bit7~1获取内容长度。

若为长型结构,则首字节的bit7~1表示后面有多少个用于表示实际长度的字节,第二个和随后的字节给出实际长度。

(5)根据得到的长度,读取后续字节,以获取该标签对应的数据内容。

(6)将标签和内容写入ASN数据结构,用于进一步释义。

(7)根据标签值和内容,对照话单格式规范,对各个字段进行释义,并写入数据库作为解码后的话单进行存储和查询。

以上思路中的递归调用比较重要,由于标签结构层数未知,需要根据标签类型判断是否继续获取下一层标签,以达到完整提取数据内容的目的。在递归调用中,可增加一个异常处理,用于防止死循环,即调用次数不能大于下一层内容的字节数,否则终止递归调用。

5 ASN.1解码器在3G中的应用

为演示解码器的工作原理,首先用一个二进制话单文件来说明数据结构。表1是一个短信始发话单的原始数据,蓝色表示ASN.1标签,绿色表示长度,白色区域表示内容。

利用设计好的解码器将话单进行ASN.1解码后的标签和值见表2。

利用解码器将原始话单解码后,再存入数据库,即可按需进行各种类型的查询和分析。除话单外,还可解码由ASN.1编码的信令、媒体流等信息。

6结束语

本文对ASN.1的语法结构和BER编解码结构进行了分析,并针对BER特点提出了解码器的实现方法,对解码的难点和关键点进行了阐述,利用递归完成了嵌套层的解码,最后举例说明了ASN.1解码器在3G中的应用。

作为网络发展方向,信息传递需要标准的表示方法,ASN.1的应用日益广泛,本文的语法解析和设计思路正适用于网络维护和程序开发等领域。

参考文献

[1]ISO 8824-1. ITU-T X.680: Specification of basic notation[S].

[2]ISO 8824-2. ITU-T X.681: Information object specification[S].

[3]ISO 8824-3. ITU-T X.682: Constraint specification[S].

[4]ISO 8824-4. ITU-T X.683: Parameterization of ASN.1[S].

[5](美)Andrew Troelsen,著. 朱晔,肖逵,张大磊, 等译. C#与.NET 3.5高级程序设计(第4版)[M]. 北京: 人民邮电出版社,2009.

【作者简介】

李 鹏:中国联合网络通信有限公司邢台市分公司网络管理中心副经理,网络工程师,通信工程师,曾主持多项MSC、HLR、IGW及WCDMA软交换开局建设和割接工程。

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文