ASN.1(Abstract Syntax Notation One, 抽象文法描述语言), 它是一种跨平台的数据序列化的接口描述语言。
ASN.1对于大多数人来讲似乎很陌生,可能很多人没有听说过ASN.1,然而事实上它就应用在我们生活的周围。比如,欧洲和日本使用的移动电话基于TCAP消息协议的,TCAP消息协议中则采用的ASN.1描述的,使用了BER(Basic Encoding Rules)编码规则,共同实现了移动电话的呼叫。可以说,在一部移动电话与另一部电话之间通信时,是ASN.1协助实现了两部话机间的呼叫。此外,ASN.1和编码规则还被联邦快递用于大量地传输信息;大公司如HP/IBM/SUN等,使用ASN.1描述其打印机作业管理的标准接口。以及简单 络管理协议SNMP就是使用ASN.1对所有数据进行描述的。
ASN.1并没有提供单一的开源实现,而是作为一种规范来供第三方供应商实现的。ASN.1主要用在定义各种基础协议中,比如常用的LDAP,PKCS,GSM,X.500等。
ASN.1是一种对分布式计算机系统之间交换的数据信息进行抽象描述的规范化语言。以前,ASN.1只用于撰写国际通用标准,然而随着ASN.1软件工具的出现,ASN.1已经用于生成应用程序编程语言代码,称为各种消息系统应用的核心。现在ASN.1成为描述通信协议的标准文法,而且对通信协议的描述,不用再区分通信程序实现的编程语言和通信数据的原始表示,也不用再秋分应用系统的复杂或简单。
总之,ASN.1是一种国际标准,它为抽象数据结构的描述说明定义了一种记法。ASN.1使用抽象语法对各种编程语言定义的数据类型进行了重新定义,将所有数据分为两大类:基本类型(布尔类型,字符串类型,整型和比特串类型等)、结构类型(结构,链表和选择类型等)。
使用抽象语法描述的系统让设计者可以只关心系统的某部分,而不必关心系统中某一部分功能如何实现或者所代表的内容。
1. ASN.1的例子
既然ASN.1是一个描述语言,那么我们先来看一个直观的例子。ASN.1的基础是module, 我们看一下ASN.1中module的例子:
上面的例子中,我们使用ASN.1定义了一个StudentCard,最外层的以BEGIN和END包围的就是module。StudentCards是module的名字,首字母必须大写。
其中::= 是一个赋值符 。
module中可以有多个type, type的名字也必须首字母大写,例如上面的StudentCard,StudentInfo等等。
每个type中定义了它的组成组件,组件的名字首字母必须小写,这些组件的名字又叫做identifiers。
上面的dateOfBirthday后面接的DATE是ASN.1中内置的类型。而student后面的StudentInfo是一个自定义类型,并且同样包含在module中。
StudentInfo中的studentName是一个VisibleString,这个String的限制是size在3到50之间。
上面我们定义module的时候在module后面加上了AUTOMATIC TAGS,这是什么意思呢p>
在ASN.1中,tags是ASN.1消息中每个组件的内部标识符,以Address为例,我们希望给Address中的每个属性都指定一个内部的标识符,如下所示:
这里面的[0] [1] 就是标识符,当然,我们可以在定义module的时候手动指定这些tags,但是如果我们使用AUTOMATIC TAGS,这些标识符会自动创建,从而避免了手动创建标识符可能带来的问题。
2. ASN.1中的内置类型
通过上面的讲解,我们对ASN.1有了一个基本的概念。如果想要对ASN.1进行更加深入的研究,那么我们首先要知道ASN.1中的内置类型。
一般来说ASN.1中有下面的数据类型:
2.1 基本类型
基本类型又称为原子类型,是构成其他结构类型的成员类型,主要包括:
-
布尔类型:BOOLEAN
BOOLEAN和编程语言中的布尔值是一致的,它有两个可能得值:TRUE和FALSE。下面是具体而用法:
removed BOOLEAN ::= TRUE
- 整型:INTEGER
INTEGER表示的是一个整数,如下所示,表示的是一个年例范围是0到100,最终的取值是18:
age INTEGER (0..100) ::= 18
- 比特串:BIT STRING
字节的位表示方法,可以给一个byte中的每一个bit进行设值:
上面的例子中,我们设置了Status,并且使用Status赋值给了一个变量myStatus。
- 字节串:OCTET STRING
字节串是以字节为单位的任意字符串。
octetExample ::= OCTET STRING
- DATE
表示日期,格式是”YYYY-MM-DD”:
birthday DATE ::= “1990-11-18”
- TIME-OF-DAY
表示日期中的时间,格式是”HH:MM:SS”:
startTime TIME-OF-DAY ::= “09:30:00”
- DATE-TIME
时间加日期的格式,它的格式”YYYY-MM-DDTHH:MM:SS”,如下所示:
endTime DATE-TIME ::= “2022-01-10T18:30:23”
- 浮点数:REAL
REAL表示的是一个浮点数,可以如下表示:
Amount ::= REAL
- ENUMERATED
ENUMERATED表示的是一个枚举,它与编程语言中描述的枚举类型一样。可以如下表示:
Colors ::= ENUMERATED {black, red, white}
myColor Colors ::= white
- IA5String
IA5String表示的是ASCII字符,并且包含有控制字符。
SampleString ::= IA5String
- VisibleString
VisibleString表示的是ASCII字符,其中不包含有控制字符。
SampleString ::= VisibleString
- NumericString
NumericString表示的是数字和空格。
SomeNumber ::= NumericString
- UTF8String
UTF8String表示的是Unicode字符
UnicodeString ::= UTF8String
- NULL
是一个空值,用来占位。
2.2 结构类型
结构类型又称为符合类型,主要包括:
-
有序成员固定结构:SEQUENCE
SEQUENCE表示的是项目的序列合集,在使用前已经确定数据成员的个数和顺序的结构体类型。如下所示:
StudentInfo ::= SEQUENCE {
name VisibleString,
phone NumericString
}
max StudentInfo ::= {name “J.Max”, phone “18888888888”}
-
有序成员待定结构:SEQUENCE OF
SEQUENCE OF表示的是一个list,在使用前已经确定数据成员数据,使用是才确定数据成员的个数的结构体链表类型。如下:
breakTimes SEQUENCE OF TIME-OF-DAY ::= {“10:00:00”, “12:00:00”, “14:45:00”}
-
无序成员固定结构:SET
在使用前已经确定数据成员的个数,但未确定数据成员顺序的结构体类型。
-
无序成员待定结构:SET OF
使用时才确定数据成员的个数和顺序的结构体链表类型。
-
选择类型:CHOICE
CHOICE由几种数据类型的数据成员构成的共同体类型。表示从众多的item中选择一个:
Identity ::= CHOICE {
name VisibleString,
phone VisibleString,
idCard VisibleString
}
jack Identity ::= name: “jack”
3. ASN.1中的限制语法
ASN.1中可以定义很多个字段,有些字段可能会有一些限制,比如手机 只能用数字,名字有长度限制等。
这些限制在ASN.1中叫做Constraints,一般来说有下面的一些限制:
- FROM
FROM提供了一个数据值的读取范围,如下:
PermittedChars ::= IA5String (FROM(“ABCDEFG1244”))
PermittedChars只允许从”ABCDEFG1244″选择。
- PATTERN
PATTERN表示的是正则表达式,如下所示:
phoneNumber ::= IA5String (PATTERN “1[0-9]#10”)
上面列出的是一个简单的手机 码的正则表达式。
- SIZE
SIZE可以表示字符串的长度或者数组的长度:
Name ::= IA5String (SIZE (4..7))
NameList ::= SEQUENCE SIZE (1..25) OF Name
- RANGE
使用..可以表示一个范围:
Age ::= INTEGER (0..100)
- 单一值
从提供的值列表中挑选一个:
Colors ::= UTF8String (“Blue” | “White”)
4. 小结
ASN.1抽象文法描述的优势,在应用系统消息协议中,特别是大型消息协议如电子商务体系中证书认证系统和支付系统协议等方面得到了发挥。使得ASN.1文法描述越来越得到系统设计和软件开发人员的一致认可,并且被更为广泛地应用。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!