ASN.1和基本编码规则
作者:亢朝峰业务四室
摘要:该文说明了ASN.1和基本编码规则(BER)的原理和应用。文中,首先描述了ASN.1,并给出了几种常见类型的相应的例子,来说明ASN.1的应用;接着对基本编码规则(BER),通过对MAP中的LocationRequest的请求操作消息的参数进行编码的具体实现,来说明基本编码规则的工作原理。总之,ASN.1和基本编码规则实际中有非常广泛的应用。
关键词:ASN.1  基本编码规则MAP消息LocationRequest
ASN.1作为一种数据表示标准产生于20世纪80年代早期的开放系统互联Internet 网络模型,但OSI模型并没有得到广泛的应用,而ASN.1标准继续使之发展,今天在实际中已有大量应用,这些应用包括:
3G移动系统:
使用ASN.1标准数据交换的第三代移动通信网络。这一系统基于UMTS(通用移动通信系统)标准,其使用了ASN.1和分组编码标准(PER)。
IP语音:
在通信领域中的另一个重要应用是通过包转换网络(如因特网)传递语音数据。
多媒体数据信号编解码器(CODEC)标准(H.323等等)基于ASN.1并且使用
于分组编码标准来获取理想的数据传输速率。
安全应用:
因特网安全授权同样也使用了ASN.1。高级编码标准在数据表示方面形成了一个方便的、平台无关的标准,比加密要优越。PKIX、PKCS和X.509也是我们所熟
悉的标准,它们也是基于ASN.1的。
传统通信网络:
ASN.1和基本编码规则(BER)已经在主要通信领域流行了很长一段时间,所
有的ss7到ISDN的一切都使用了ASN.1 BER信息在各种类型的设备和计算机
之间传递信号。
军事和空间应用:
美国国家宇航局(NASA)在其航空通信网规范中,也正在使用ASN.1和分组编码规则作为空对地或地对空协议。
一、概述
众所周知,抽象是解决软件开发问题的有效手段。利用抽象,设计人员可以定义系统的一个部分而不用关注这个部门实际上是如何实现或者表达的。这一方法使得实现open,它
“”
简化了定义过程,使得在实现部件之前可以声明某些公理、并且在设计高层部件时假定下层部件是可以实现的。抽象是现代多数软件规范的特点。
作为当今最复杂的系统之一,开放系统互联(OSI)是一个包含了大量抽象的例子。OSI是一个国际通用的标准体系,从物理层一直到用户层,规划了计算机之间的互联。高层次的对象被抽象定义,并将由底层的对象来实现。比如,某层的一个服务可能需要在计算机之间传递某个抽象对象;某一底层则可能提供关于0、1字符串的实现,利用一些编码规则把高层的抽象对象转换成这些字符串。
OSI的说明抽象对象的方法叫做抽象语法标记(ASN.1,在X.208中定义),而用0、1字符来表示这样的对象的规则集合叫做基本编码规则(BER)。ASN.1是一个很灵活的标记法,它允许定义众多的数据类
型从整数和位串等简单类型到如集合、序列等的结
——
构,还可以是其它复杂定义的类型。BER描述了如何将ASN.1类型表示和编码成八位字节串。通常不止一种编码给定数据的方法,另一种叫做DER(Distinguished Encoding Rules)的编码集合,它是BER的子集,其特点是给每一个ASN.1值一个唯一的编码。
图1.1 说明了抽象语法、编码规则之间的关系。从图中可以看出,抽象语法利用一些正式的规则来描述各种用户数据;而编码规则采用适当的方法将用抽象语法描述的用户对象定义为适合物理传输信道传输的格式。
图1.1  抽象语法、编码规则之间的关系
二、抽象语法标记(ASN.1)
ASN.1(Abstract Syntax Notation One)是一种用于描述结构化客体结构和内容的语言。它定义在ISO 8824或ITU-T X.208中。ASN.1类似于高级程序设计语言的数据描述
部分。它提供若干语言构件用以定义类型和值,类型对应结构,值对应内容。但和其他程序设计语言不同的是,ASN.1的类型不需要机器实现。
一个ASN.1的值可以用不同的方法表示:打印值是用打印的形式表示的ASN.1的值,对人而言,它是一种严格的表示法,因为它不必依赖任何机器的体系结构;本地值是由程序设计语言或系统用来表示ASN.1的值;传送值表示传送中的ASN.1的值,它是ASN.1值的比特流形式,是根据一组称之为传送文法(T ransfer Syntax)的规则而得到的。ASN.1值的表示法决定了它的开发性和互操作性,并成为一种通用的信息交换的表示法。
ASN.1可以定义各种各样的简单类型数据,也可以定义十分复杂的数据结构类型。2.1 ASN.1的模块
ASN.1的基本单位是模块(module)。ASN.1模块实际上是由一组类型定义和值定义组成的。类型定义就是说明类型的名称和类型的格式,值定义则是规定将什么样的具体值赋给某一类型的变量。
ASN.1模块的一般格式如下:
ModuleDefinition ::=
ModuleIdentifier
DEFINITIONS
T agDefault
“::=”
BEGIN
EXPORTS
IMPORTS
AssignmentList
END
其中,
ModuleIdentifier是模块标识符,也就是模块的名称( 模块名的第一个字母必须大写);
IMPORTS结构规定了模块中某些定义是从其他模块中移植过来的;
EXPORTS结构用于定义其他模块可以移植的类型或值。
类型定义和值定义是通过类型分配(type assignment)和值分配(value assignment)来完成的。类型分配和值分配包含于模块的AssignmentList中。类型分配和值分配的格式如下:
类型定义
语法:<type name> := type
类型的赋值:
<value name> <type> ::= <value>
2.2 简单类型
1.INTEGER
整数类型。与一般程序设计语言不同的是,ASN.1中没有限制整型的位数。也就是说INTEGER可以是任意大小的整数。
定义一个整型类型Counter
Couter := INTEGER
IpAddress := Octetstring
变量的赋值:
例子:
ipInReceives Counter ::= 2450
2.BOOLEAN
布尔型。取值为TURE或FALSE.
3.REAL
实数类型。和整型一样,ASN.1中对实数的精度没有限制。每个实数都可以表示为M*B E,即三元组{M,B,E}的形式,其中M是尾数,B是级数,E是指数。
4.ENUMERATED
枚举类型。枚举类型实际上是一组个数有限的整型值。可一个每个整型值赋以不同的意义。
5.BIT STRING
位串类型,由零个或多个比特组成的有序位串。位串的值可以由对应的二进制或者十六进制串表示。其中左边的位由较高的权重。
6.OCTET STRING
八位位组串。由零个或多个八位位组组成的有序串。八位位串可以用十进制、二进制或者十六进制表示。
7.OBJECT IDENTIFIER
对象标识符。从对象树派生出的一系列点分数字串的形式,用来标识对象。8.NULL
空值类型。这是最简单的一种类型,它仅包含一个值NULL。主要由于位置的填充。
――
如果某时刻无法得知数据的准确值,那么最简单的方法就是将这一数据定义为NULL类型。9.CHARACTER STRING
字符串类型。ASN.1中定义了一些字符集不完全相同的CHARACTER STRING类型。不同类型包含的字符集不同。字符串由双引号扩起。
字符串类型包括:
NumericString:包含数字0到9以及空格;
PrintableSting:包含所有大小写字母、数字、标点和空格;
IA5String:由取自IA5(5号国际字符表)的字符组成,它和ASCII码基本相同;
VisibleString:由取自IA5的图形字符组成;
GeneralString:包含所有的标准字符。
2.2 构造类型
1.SEQUENCE
序列类型,是包含零个或者多个组成元素的有序列表。列表的不同元素可以属于不同的数据类型。
结构类型定义
SequenceT ype ::=
SEQUENCE{ElementT ypeList} |
SEQUENCE{ }
ElementT ypeList ::=
ElementT ype |
ElementT ypeList,ElementT ype
ElementT ype ::=
NamedT ype |
NamedT ype OPTIONAL |
NamedT ype DEFAUL T Value |
COMPONENTS OF T ype
有序列表的每个元素是由元素名称和元素类型组成。元素类型可以是简单类型,也可以是定义的其他构造类型。元素类型标识符后可以跟OPTIONAL或DEFAUL T关键字。OPTIONAL关键字表示在序列类型的实例中该元素可以出现,也可以不出现。DEFAUL T关键字表示序列类型的实例中该元素具有事先指定的缺省值。COMPONENTS OF 关键字表示它包含了给定序列中的所有组成元素。
例子:
UserAccount ::= SEQUENCE {
username VisibleString,
password VisibleString,
accountNr INTEGER
}
结构赋值:
字符串是什么类型的SequenceValue ::=
{ElementValueList} |
{ }
ElementValueList ::=
NamedValue |
ElementValueList,NamedValue
例子:
myAccount UserAccount ::= {
username "steffen",
password "jane51",
accountNr 4711
}
2.SEQUENCE OF
单纯序列(数组)类型。即序列中的各项属于同一类型的ASN.1类型。
SequenceOfT ype ::=SEQUENCE OF T ype |
SEQUENCE
例子:
MemberCountries ::= SEQUENCE OF VisibleString

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。