2.3 ASN.1基础
ASN.1最为基础的内容主要包括基础符号和使用语法。
2.3.1 ASN.1的基础符号
BFN标记了ASN.1,使它成为一种抽象的定义形式——数据描述语言。类似于普通的编程语言。ASN.1也有相应的描述语法,不过与普通的编程语言相比,ASN.1是定义上层语法(抽象)的。该如何来理解这一点?举个不严谨的例子:ASN.1定义的是数据类型,而普通编程语言定义的是变量。比如C语言中int a=1,表示定义了一个整型变量,在32位字长的计算机里,占用了4个字节。而ASN.1则相当于定义了C语言中数据类型的int,并赋予它一个标志。万物总有起源,ASN.1标准中也有类似的基础元素,它们类比于物理世界中的基本组成单位“原子”。它们是标识符、关键字、基本词汇/单词,是基础类型。由这些基本的数据和类型,推导出更复杂的数据类型和结构。这些关键字都具有特定的含义,用户不应该作为变量来使用。表2-2列出了常用的关键字或保留字,在后续的内容中将会看到它们。
表2-2 ASN.1中常见关键字或保留字的符号及含义
除了表2-1中的常见保留字外,ASN.1中还使用下面的符号,当然ASN.1中还包括其他的符号,此处并未全部列出,只列出后续可能用到的符号,见表2-3。
表2-3 常见ASN.1中的符号及含义
表2-4则介绍了ASN.1中另外一部分符号,主要是SNMP中常出现的基本词汇。基本词汇一般需要在产生式中由具体的数字、字母、符号等代替,其作为产生式推导过程中的结束标志。
表2-4 常见基本词汇符号及含义
以上只列举了ASN.1中的部分内容,更多的信息可参考标准文献ITU-T Rec.X.680|ISO/IEC 8824-1。
下面,以上述文献中定义的类型引用和值引用,呈现ASN.1多层级的标记方法。
--以BOOLEAN为例 --使用内置类型BOOLEAN BooleanType ::= BOOLEAN --内置类型BOOLEAN可取的值 BooleanValue ::= TRUE | FALSE --内置类型定义 BuiltinType ::=BitStringType | BooleanType| --后续值省略 --内置数据值空间 BuiltinValue ::= BitStringValue | BooleanValue | --后续值省略 --Value可取的值空间 Value ::= BuiltinValue | ReferencedValue | --后续值省略 --Type可取的值空间 Type ::= BuiltinType | --后续值省略 -- 类型赋值 TypeAssignment ::= typereference "::=" Type -- 值赋值 ValueAssignment ::= valuereference Type "::=" Value
根据上述ASN.1的定义,完成类型引用和值引用的实例化操作:见2.3.2节的“定义方法”。
注意
使用自定义的标识符定义类型和值时应该遵循ASN.1中的文本约定。合法的标识符由字母、数字、连字符“-”组成(连字符,不是下划线!),且以字母开头。字母大写和小写被视为两个不同的字符。正确的例子如“This-Ok”;错误的例子如“2Wrong”“wrong too”。首字母大小写的问题请参见表2-4。在ASN.1中,符号的定义也没有先后次序,可以先使用后定义,这在产生式中是最常见的。多个空格或空行等同于一个空格,需要引起注意的是,像“::=”等由多个字符组成的标识符时千万不要加入空格,否则被定义的内容不能正确解析。
2.3.2 定义方法
ASN.1描述信息时使用的方法是分别定义信息所属的类型和值。通过对该信息类型和值的限制,最终实现信息的完整描述。在对新类型定义时,使用下面的BNF格式:
<new-type> ::= <old-type>
如,
MYINT ::= INTEGER
对某类型变量赋值的BNF格式为如下所述,实际是将该类型实例化了。
注意
实例化是本书常出现的概念。实例化实际就是“赋值”,可以是类型的实例化也可以是值的实例化,完成对类型的定义和值的赋值。对于值的实例,获取该实例就是获取具体的值。
<variable-name> <Type> ::= <value>
如:
how-many-books MYINT::= 5
将整数5赋值给变量how-many-books,完成类型和值的赋值。这与C语言的语法基本类似,只是类型和变量名的位置相反而已。
按照BNF的定义,使用MYINT定义某类型同INTEGER定义的效果是一致的。这与C语言中typedef的功能相似,仅为类型定义了一个别名而已。
本章下面的内容主要讲解ASN.1中提供了哪些类型,以及如何使用它们来描述我们需要表示的对象。