本节书摘来自异步社区《精通SNMP》一书中的第2章,第2.3节,作者: 武孟军 更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.3 常用类型
ASN.1定义了十几种基本类型和结构类型,这些类型都属于通用类。用户可以使用这些类型,定义自己需要的数据类型。
定义类型时,要分别定义类型符号和属于该类型的值符号,一般是给出类型符号和值符号的一系列产生式。对SNMP中用到的类型,应理解它的产生式,这样,在遇到不常见的符号形式时,能根据它的产生式正确判断符号形式的意义。
注意:
下面介绍的类型的BNF产生式的右侧,出现了Type、Value、DefinedValue等符号。它们不是ASN.1的关键字,也不是基本单词,它们在X.208标准中有定义。可以参见附录一。
2.3.1 简单类型
简单类型包括整数类型、逻辑类型、空类型、字节串类型和对象标识符类型,是ASN.1中最常用、最基本的类型。
(1)整数类型,包括正或负的任意整数以及0。
它的类型符号BNF语法如下(前面的序号为方便解释而增加的,下同):
(1) IntegerType ::=INTEGER | INTEGER{NamedNumberList}
(2) NamedNumberList ::=NamedNumber | NamedNumberList,NamedNumber
(3) NamedNumber ::= identifier(SignedNumber) | identifier(DefinedValue)
(4) SignedNumber ::= number | -number
值符号语法如下:
IntegerValue ::=SignedNumber | identifier
IntegerType和IntegerValue分别是ASN.1使用的整型类型引用和整型值引用,其余类型与它们相似。
第1条产生式右侧有两个可选项INTEGER和INTEGER{NamedNumberList},其意义可以理解为,整数类型的类型符号IntegerType被定义为INTEGER或INTEGER{NamedNumberList}。当选择第1个选择项INTEGER时,它是ASN.1关键字,也是终结符,则可确定类型符号为INTEGER;当选择第2个选择项时,符号{ 和 }为基本单词,利用第2条和第3条(选第1个选择项,identifier为基本单词,用具体的标识符替换)产生式替换NamedNumberList,并使用第4条产生式用number替换SignedNumber,然后用数字替换number,最终,IntegerType可以推导出下面的符号形式(当然还可以推出其他形式):
INTEGER
INTEGER { one-octet (1),two-octet(2),three-octet(3)}
(2)逻辑类型,只有两个值可选:TRUE或FALSE。
它的类型符号BNF语法如下:
BooleanType ::= BOOLEAN
值符号BNF语法如下:
BooleanValue ::= TRUE | FALSE
(3)空类型,只有一个值NULL。类型符号BNF语法如下:
NullType ::= NULL
值符号BNF语法如下:
NullValue ::= NULL
(4)OCTECT STRING,字节串类型,0个或多个字节组成的序列。
类型符号BNF语法如下:
OctetStringType ::= OCTET STRING
值符号BNF语法如下:
OctetStringValue ::= bstring | hstring
bstring 和 hstring是基本符号,在2.2.4小节中有定义。
(5)OBJECT IDENTIFIER,对象标识符类型,可以用来标识任意的信息实体。
类型符号BNF语法如下:
ObjectIdentifierType ::= OBJECT IDENTIFIER
值符号BNF语法如下:
(1) ObjectIdentifierValue ::= {ObjIdComponentList} | {DefinedValue ObjIdComponentList}
(2) ObjIdComponentList ::= ObjIdComponent | ObjIdComponent ObjIdComponentList
(3) ObjIdComponent ::= NameForm | NumberForm | NameAndNumberForm
(4) NameForm ::= identifier
(5) NumberForm ::= number | DefinedValue
(6) NameAndNumberForm ::= identifier ( NumberForm )
类型符号定义比较简单,值符号定义稍微复杂些。使用第5条生成式中的number递归替换第3、第2和第1条生成式对应的符号,最后可以得到值符号形式之一:
{ number number number number }
继续用数字替换number,可得到如下的值符号形式:
{ 1 3 6 1 }
同样,使用第6条产生式递归替换上面的生成式,则可以得到类似的值符号形式:
{iso (1) org (3) dod (6) internet (1) mgmt (2) mib-2 (1)}
再如,使用第4条产生式,用identifier替换NameForm,同时使用number替换NumberForm,同样的值最终还可以表示为:
{ mgmt 1 }
2.3.2 结构类型
结构类型有SET、SET OF、SEQUENCE和SEQUENCE OF几种,其中前两种SNMP中没有用到,这里只介绍后两种。
(1)SEQUENCE结构类型,组件可以是0个或多个不同类型组成的有序序列。
它的类型符号BNF语法如下:
(1) SequenceType ::= SEQUENCE {ElementTypeList} | SEQUENCE { }
(2) ElementTypeList ::= ElementType | ElementTypeList,ElementType
(3) ElementType ::= NamedType | NamedType OPTIONAL | NamedType DEFAULT Value
| COMPONENTS OF Type
值符号BNF语法如下:
SequenceValue ::= {ElementValueList} | { }
ElementValueList ::= NamedValue | ElementValueList,NamedValue
SNMP中,第3个生成式中后3个选项是不允许使用的。
其中,NamedType和NamedValue在X .208中有定义,简单起见,这里可以理解为已经定义的类型和对应的值。
(2)SEQUENCE OF构造类型,由同一类型组成的有序序列。类型符号BNF语法如下:
SequenceOfType ::= SEQUENCE OF Type | SEQUENCE
值符号BNF语法如下:
SequenceOfValue ::= {ValueList} | { }
ValueList ::= Value | ValueList,Value
2.3.3 其他类型
CHOICE和ANY是两个特殊的类型。
(1)CHOICE是选择类型,在列举的类型序列中选择一种。它的类型符号BNF语法如下:
ChoiceType ::= CHOICE{AlternativeTypeList}
AlternativeTypeList ::= NamedType | AlternativeTypeList,NamedType
值符号BNF语法如下:
ChoiceValue ::= NamedValue
(2)ANY是任意类型,可以是ASN.1或其他标准定义的任意一种类型。它的类型符号BNF语法如下:
AnyType ::=ANY |ANY DEFINED BY identifier
值符号BNF语法如下:
AnyValue ::= TypeValue
这两种类型的值符号等同于取代它们的具体类型,因此,没有为它们分配标志,其标志就是运行时期取代它的有具体类型的标志码。