1、第章 抽象语法表示ASN.1第章 抽象语法表示ASN.12.1 网络数据表示网络数据表示 2.2 ASN.1的基本概念的基本概念 2.3 基本编码规则基本编码规则 2.4 ASN.1宏定义宏定义 习题习题 第章 抽象语法表示ASN.1表示层的功能是提供统一的网络数据表示。在互相通信的端系统中至少有一个应用实体(例如FTP、TELNET、SNMP等)和一个表示实体(即ASN.1)。表示实体定义了应用数据的抽象语法,这种抽象语法类似于通常程序设计语言定义的抽象数据类型。应用协议按照预先定义的抽象语法构造协议数据单元,用于和对等系统的应用实体交换信息。表示实体则对应用层数据进行编码,将其转换成二进制
2、的比特串,例如把十进制数变成二进制数、把字符变成ASCII码等。比特串由下面的传输实体在网络中传送。把抽象数据变换成比特串的编码规则叫做传输语法。在各个端系统内部,应用数据被映像成本地的特殊形式,存储在磁盘上或显示在用户终端上,如图2.1所示。2.1 网络数据表示网络数据表示 第章 抽象语法表示ASN.1本地存储端系统A用户本地映像应用实体用户表示映像编码规则表示实体抽象语法ASN.1本地存储本地映像端系统B用户应用实体用户表示映像编码规则表示实体传输语法BER图2.1 关于信息表示的通信系统模型 第章 抽象语法表示ASN.1特别需要指出的是,这里提到的抽象语法是独立于任何编码技术的,只与应用
3、有关。抽象语法要能满足应用的需要,能够定义应用需要的数据类型和表示这些类型的值。ASN.1是根据当前网络应用的需求制定的标准(CCITT X.208和ISO 8824),也许随着网络应用的发展,还会开发出新的表示层标准。另外值得一提的是,对应一种抽象语法可以选择不止一种传输语法。对传输语法的基本要求是支持对应的抽象语法,另外还可以有其他一些属性,例如支持数据加密或压缩,或者两者都支持。第章 抽象语法表示ASN.12.2 ASN.1的基本概念的基本概念 作为一种形式语言,ASN.1有严格的BNF定义。我们不想全面研究它的BNF定义,而是自底向上地解释ASN.1基本概念,然后给出一个抽象数据类型的
4、例子。下面列出ASN.1文本的书写规则,这些规则叫做文本约定(Lexical Conventions):(1)书写的布局是无效的,多个空格和空行等效于一个空格;(2)用于表示值和字段的标识符、类型指针(类型名)和模块名由大小写字母、数字和短线(Hyphen)组成;第章 抽象语法表示ASN.1(3)标识符以小写字母开头;(4)类型指针和模块名以大写字母开头;(5)ASN.1定义的内部类型全部用大写字母表示;(6)关键字全部用大写字母表示;(7)注释以一对短线(-)开始,以一对短线或行尾结束。第章 抽象语法表示ASN.12.2.1 2.2.1 抽象数据类型抽象数据类型在ASN.1中,每一个数据类型
5、都有一个标签(Tag),标签有类型和值(见表2.1),数据类型是由标签的类型和值惟一决定的,这种机制在数据编码时有用。标签的类型分为以下4种:通用标签:用关键字UNIVERSAL表示,带有这种标签的数据类型是由标准定义的,适用于任何应用;应用标签:用关键字APPLICATION表示,是由某个具体应用定义的类型;上下文专用标签:这种标签在文本的一定范围(例如一个结构)中适用;第章 抽象语法表示ASN.1 私有标签:用关键字PRIVATE表示,这是用户定义的标签。ASN.1定义的数据类型有20多种,标签类型都是UNIVERSAL,如表2.1所示。这些数据类型可分为4大类。简单类型:由单一成分构成的
6、原子类型;构造类型:由两种以上成分构成的构造类型;标签类型:由已知类型定义的新类型;其他类型:包括CHOICE和ANY两种类型。第章 抽象语法表示ASN.1表表2.1 ASN.1定义的通用类型定义的通用类型 标 签 类 型 值 集 合 UNIVERSAL 1 BOOLEAN TRUE,FALSE UNIVERSAL 2 INTEGER 正数、负数和零 UNIVERSAL 3 BIT STRING 0个或多个比特组成的序列 UNIVERSAL 4 OCTET STRING 0个或多个字节组成的序列 UNIVERSAL 5 NULL 空类型 UNIVERSAL 6 OBJECT IDENTIFIE
7、R 对象标识符 UNIVERSAL 7 Object Descriptor 对象描述符 UNIVERSAL 8 EXTERNAL 外部文件定义的类型 UNIVERSAL 9 REAL 所有实数 UNIVERSAL 10 ENUMERATED 整数值的表,每个整数有一个名字 UNIVERSAL 1115 保留 为ISO 8824保留 第章 抽象语法表示ASN.1UNIVERSAL 16 SEQUENCE,SEQUENCE OF 序列 UNIVERSAL 17 SET,SET OF 集合 UNIVERSAL 18 NumericString 数字 09 和空格 UNIVERSAL 19 Print
8、ableString 可打印字符串 UNIVERSAL 20 TeletexString 由 CCITT T.61 建议定义的字符集 UNIVERSAL 21 VideotexString 由 CCITT T.100 和 T.101 建议定义的字符集 UNIVERSAL 22 IA5String 国际标准字符集 5(相当于 ASCII 码)UNIVERSAL 23 UTCTime 时间 UNIVERSAL 24 GeneralizedTime 时间 UNIVERSAL 25 GraphicString 由 ISO 8824 定义的字符集 UNIVERSAL 26 VisibleString 由
9、 ISO 646 定义的字符集 UNIVERSAL 27 GeneralString 通用字符集 UNIVERSAL 28 以后 保留 为 ISO 8824 保留 表表2.1 ASN.1定义的通用类型定义的通用类型 第章 抽象语法表示ASN.11.1.简单类型简单类型 表2.1中除了UNIVERSAL 16和UNIVERSAL 17之外都是简单类型。这些类型的共同特点是可以直接定义它们的值的集合,可以把这些类型作为原子类型构造新的数据类型。简单类型还可以分为4组。第一组包括BOOLEAN、INTEGER、BIT STRING、OCTET STRING、REAL和ENUMERATED等。这一组可
10、以叫做基本类型,它们的值已经在表2.1中列出了。需要说明的是,实数可以表示为科学计数法:M BE 第章 抽象语法表示ASN.1其中尾数M和指数E可以取任何正/负整数值,基数B可取2或10。枚举类型ENUMERATED是一个整数的表,每一个整数有一个名字。与此类似的是,对于某些整数类型的值也可以定义一个名字,但这两种类型是有区别的。对整数可以进行算术运算,但对枚举类型却不能进行任何算术运算,也就是说,枚举类型的值只是用整数表示的一个符号,而不具有整数的性质。下面是定义枚举类型和定义整数类型的例子:EthernetAdapterStatus:=ENUMERATEDnormal(0),degrade
11、d(1),offline(2),failed(3)EthernetNumberCollisionsRange:=INTEGERminimum(0),maximum(1000)第章 抽象语法表示ASN.1在ASN.1中,用符号:=表示产生式,读做“定义为”。显然,EthernetNumberCollisions Range类型的变量只能取两个整数值:0和1000。第二组包括各种字符串类型,标签为UNIVERSAL 1822和UNIVERSAL 2527,这些类型都可以看作是OCTET STRING类型的子集,它们都是采纳其他标准的类型。第章 抽象语法表示ASN.1第三组包括OBJECT IDEN
12、TIFIER和Object Descriptor两种类型。我们用对象类型泛指网络中传输的任何信息对象,例如标准文档、抽象语法和传输语法、数据结构和管理对象等都可以归入信息对象范畴。OBJECT IDENTIFIER类型的值是一个对象标识符,由一个整数序列组成,它惟一地标识一个对象。对象描述符(Object Descriptor)则以人工可读的形式描述信息对象的语义。第章 抽象语法表示ASN.1第四组包含4种类型。NULL是空类型,它没有值,只占用结构中的一个位置,该位置可能出现或不出现数据。EXTERNAL是外部类型,即标准之外的文档定义的类型。UTCTime和GeneralizedTime是
13、两种有关时间的类型,其区别是表示时间的形式不同。前者(世界通用时)分别用两位数字表示年、月和日(即YYMMDD),然后是时、分和秒(即hhmmss),最后可以说明是否为本地时间;而后者用4位数字表示年,用两位数字表示月和日,最后也可以说明是否为本地时间。例如20000721182053.7是GeneralizedTime类型的一个值,表示2000年7月21日,当地时间18点20分53.7秒。而值20000721182053.7Z表示同样的时间,但是加了符号Z,则表示UTC时间。如果写为20000721182053.7+0800则除了表示同样的当地时间外,还说明了加8小时可以得到UTC时间。第章
14、 抽象语法表示ASN.12.2.构造类型构造类型构造类型有序列和集合两种,分别用SEQUENCE和SEQUENCE OF表示不同类型和相同类型元素的序列,分别用SET和SET OF表示不同类型和相同类型元素的集合。序列和集合的区别是前者的元素是有序的,而后者是无序的。我们可以定义任何已知类型的序列,定义序列的语法是:第章 抽象语法表示ASN.1SequenceType:=SEQUENCEElementTypeList|SEQUENCE ElementTypeList:=ElementType|ElementTypeList,ElementTypeElementType:=NamedType|N
15、amedType OPTIONAL|NamedType DEFAULT Value|COMPONENTS OF Type 第章 抽象语法表示ASN.1在这个表达式中,NamedType是一个类型指针。序列的每一成分类型可能跟随关键字OPTIONAL(表示任选)或DEFAULT(表示默认值)。COMPONENTS OF子句用于指示另外一个被包含的类型。定义SEQUENCE OF类型的语法如下:SequenceOfType:=SEQUENCE OF Type|SEQUENCE第章 抽象语法表示ASN.1下面是定义序列类型的例子:EthernetCollisionsCounter:=SEQUENCE
16、 highValue INTRGER,lowValue INTEGER TokenRingTokensLost:=SEQUENCE OF highValueINTRGER,lowValue INTEGER LanSimpleCounterLimits:=SEQUENCE ethernetCounter1 COMPONENTS OF EthernetCollisionsCounter,tokenRingCounter1COMPONENTS OF TokenRingTokensLost 第章 抽象语法表示ASN.1定义SET和SET OF的语法是类似的:SetType:=SET ElementTy
17、peList|SET SetOfType:=SET OF Type|SET 第章 抽象语法表示ASN.1下面是定义集合类型的例子:LanWorkstationSerialNumbers:=OCTET STRING(SIZE(32)LanSegment:=SET OF LanWorkstationSerialNumbersMacAddresses:=OCTET STRING(SIZE(6)EthernetNetworks:=SET OF MacAddressesTokenRingNetworks:=SET OF LanSegmentLanNetwork:=SET etherNet 0 IMPLI
18、CIT EthernetNetworks,tokenNet 1 IMPLICIT TokenRingNetworks 第章 抽象语法表示ASN.13.3.标签类型标签类型虽然ASN.1的所有类型都带有标签,但这里所谓的标签类型,是指应用或用户加在某个类型上的标签。起码有两种情况需要给一个现有的类型加上标签:首先是一个类型可以有多个类型名,例如为了使语义更丰富,可能用Employee-name和Customer-name表示同一类型,这样可以给两者指定同一应用标签APPLICATION 0。另外,在一个结构类型(序列或集合)中,可以用上下文专用标签区分类型相同的元素。例如集合中有3个同样类型的元
19、素,一个指本人的名字,一个指父亲的名字,另一个指母亲的名字,分别为其指定不同的上下文专用标签1、2和3以示区别,参见下例:第章 抽象语法表示ASN.1Parentage:=SETSubjectName1 IMPLICIT IA5String,MotherName 2 IMPLICIT IA5String OPTIONAL,FatherName 3 IMPLICIT IA5String OPTIONAL 第章 抽象语法表示ASN.1标签类型可以是隐含的或明示的,分别用关键字IMPLICIT和EXPLICIT(可省略)表示。隐含标签的语义是用新标签替换老标签,因此编码时只编码新标签。上例中,3个集
20、合元素的上下文标签都是隐含的,因此编码时只编码上下文专用标签。明示标签的语义是在一个基类型上加上新标签,从而导出一个新类型。事实上,明示标签类型是把基类型作为惟一元素的构造类型,在编码时,新老标签都要编码,可见隐含标签可以产生较短的编码。但明示标签也是有用的,特别用于基类型未定时,例如基类型为CHOICE或ANY类型。第章 抽象语法表示ASN.14.4.其他类型其他类型CHOICE和ANY是两个没有标签的类型,因为它们的值是未定的,而且类型也是未定的。当这种类型的变量被赋值时,它们的类型和标签才确定,可以说标签是运行时间确定的。CHOICE是可选类型的一个表,仅其中一个类型可以被采用,产生一个
21、值。事实上CHOICE类型是所有成分类型的联合,这些成分类型是已知的,但是在定义时尚未确定。CHOICE类型定义为ChoiceType:=CHOICEAlternativeTypeListAlternativeTypeList:=NamedType|AlternativeTypeList,NamedType 第章 抽象语法表示ASN.1下面是定义CHOICE类型的例子:EthernetAdapterNumber:=CHOICENULL,OCTET STRINGANY类型表示任意类型的任意值,与CHOICE类型不同之处在于实际出现的类型也是未知的,通常记为AnyType:=ANY|ANY DEF
22、INED BY identifier例如,我们可以定义SoftwareVersion:=ANY或SoftwareVersion:=ANY DEFINED BY INTEGER 第章 抽象语法表示ASN.12.2.2 2.2.2 子类型子类型子类型是由限制父类型的值集合而导出的类型,因此子类型的值集合是父类型的子集。子类型还可以再产生子类型。产生子类型的方法有6种,如表2.2所示。第章 抽象语法表示ASN.1表表2.2 产生子类型的方法产生子类型的方法 第章 抽象语法表示ASN.11.1.单个值单个值这种方法就是列出子类型可取的各个值。例如,我们可以定义小素数为整数类型的子集:SmallPrim
23、e:=INTEGER(2|3|5|7|11|13|15|17|19|23|29)另外,如果定义Months为枚举类型:Months:=ENUMERATEDjanuary(1),february(2),march(3),april(4),may(5),june(6),july(7),august(8),september(9),october(10),november(11),december(12)第章 抽象语法表示ASN.1则可以定义First-quarter和Second-quarter为Months的子类型:First-quarter:=Months(january,february,m
24、arch)Second-quarter:=Months(april,may,june)第章 抽象语法表示ASN.12.2.包含子类型包含子类型这里要用到关键字INCLUDES,说明被定义的类型包含了已有类型的所有的值。例如下面的定义:First-half:=Months(INCLUDES First-quarter|I NCLUDES Second-quarter)另外,也可以直接列出被包含的值,例如First-third:=Months(INCLUDES First-quarter|april)第章 抽象语法表示ASN.13.3.值区间值区间这种方法只能应用于整数和实数类型,指出子类型可取值
25、的区间。在下面的定义中PLUS-INFINITY和MINUS-INFINITY分别表示正、负最大值,MAX和MIN分别表示父类型可允许的最大值和最小值,区间可以是闭区间或开区间。如果是开区间,则加上符号“”。因此下面4个定义是等价的:PositiveInteger:=INTEGER(0.PLUS-INFINITY)PositiveInteger:=INTEGER(1.PLUS-INFINITY)PositiveInteger:=INTEGER(0.MAX)PositiveInteger:=INTEGER(1.MAX)第章 抽象语法表示ASN.1同理,下面4个定义也是等价的:NegativeIn
26、teger:=INTEGER(MINUS-INFINITY.0)NegativeInteger:=INTEGER(MINUS-INFINITY.-1)NegativeInteger:=INTEGER(MIN.0)NegativeInteger:=INTEGER(MIN.-1)第章 抽象语法表示ASN.14.4.可用字符可用字符这种方法只能用于字符串类型,限制可使用的字符集。下面是两个限制可用字符的例子:TouchToneButtons:=IA5String(FROM(0|1|2|3|4|5|6|8|9|*|#)DigitString:=IA5String(FROM(0|1|2|3|4|5|6|
27、8|9)第章 抽象语法表示ASN.15.5.限制大小限制大小可以对5种类型限制其规模大小,例如限制比特串、字节串或字符串的长度,限制构成序列或集合的元素(同类型)个数等。例如X.25公共数据网的地址由514个数字组成,这个规定可用下面的定义表示:It1DataNumber:=DigitString(SIZE(5.14)下面的定义说明一个参数表包含最多12个参数:ParameterList:=SET SIZE(0.12)OF Parameter 第章 抽象语法表示ASN.16.6.内部子类型内部子类型这种方法可用于序列、集合和CHOICE类型。这是一种很复杂的子类型关系,下面用例子说明。假定有一
28、种协议数据单元:PDU:=SETalpha0 INTEGER,beta 1 IA5String OPTIONAL,gamma2 SEQUENCE OF Parameter,delta3 BOOLEAN 第章 抽象语法表示ASN.1下面定义的子类型测试协议数据单元要求布尔值必须是FALSE,整数值必须是负的:TestPDU:=PDU(WITH COMPONENTS.delta(FALSE),alpha(MIN.0)另外一个测试子类型要求beta参数必须出现,其值为5或12个字符组成的串:FurtherTestPDU:=TestPDU(WITH COMPONENTS.beta(SIZE 5|12)
29、PRESENT)第章 抽象语法表示ASN.1内部子类型还可以用于序列,例如:Text-block:=SEQUENCE OF VisibleStringAddress:=Text-block(SIZE(1.6)|WITH COMPONENT(SIZE(1.32)这个例子说明地址包含16个Text-block,每一个Text-block包含132个字符。第章 抽象语法表示ASN.12.2.3 2.2.3 数据结构示例数据结构示例下面是取自CCITT X.208的一个数据结构示例。图2.2(a)是关于个人记录的非形式描述,其中包括姓名、头衔、雇员编号、雇佣日期、配偶姓名和子女数等6项信息,而且对每个
30、子女也要给出姓名和出生日期。图2.2(b)是用ASN.1描述个人记录的抽象语法。其中对雇员编号的定义为EmployeeNumber:=APPLICATION 2IMPLICIT INTEGER 第章 抽象语法表示ASN.1其中,EmployeeNumber被定义为整数类型,而且加上了应用标签APPLICATION 2。IMPLICIT表示隐含的,因此编码时只编码应用标签,不必编码整数类型的标签UNIVERSAL 2。对Date类型的定义也是类似的,它被说明为ISO 646定义的字符串类型,注释YYYYMMDD提示了日期的书写格式。Name是序列类型,由3个元素组成,各个元素的名字分别为give
31、nName、initial和 familyName。ChildInformation是集合类型,其中的第一个元素没有名字,只有类型。第二个元素的名字为dateOfBirth,其类型为Date。Date类型还出现在PersonnelRecord的定义中,在这两个地方被分别赋予上下文专用的标签0和1。第章 抽象语法表示ASN.1最后,个人记录的整体结构被定义为含有6个元素的集合,该集合的最后一个成分为同类型元素的序列,默认值为空序列。ASN.1不仅提供了表示数据结构的手段,而且给出了表示抽象数据类型值的方法,图2.2(c)表示出个人记录的一个具体值。第章 抽象语法表示ASN.1图2.2 ASN.1
32、表示的抽象语法(a)个人记录;(b)个人记录的抽象语法;(c)个人记录的一个值 NameJob titleEmployee numberDate of hireName of spouseNumber of childrenChild informationNameDate of birthChild informationNameDate of birth PersonnelRecord:=APPLICATION 0IMPLICIT SETName,title0VisibleString,numberEmployeeNumber,dateOfHire1Date,nameOfSpouse 2N
33、ame,children3IMPLICIT SEQUENCE OF ChildInformation DEFAULT ChildInformation:=SETName,dateOfBirth0Date Name:=APPLICATION 1IMPLICIT SEQUENCEgivenNameVisibleString,initialVisibleString,familyName VisibleString EmployeeNumber:=APPLICATION 2IMPLICIT INTEGER Date:=APPLICATION 2IMPLICIT VisibleString-YYYYM
34、MDDgivenName John,initial P,familyName Smith,titleDirector,number 51,dateOfHire19710917,nameOfSpousegivenName Mary,initial T,familyName Smith,childrengivenName Ralph,initial T,familyName Smith,dateOfBirth 19981111,givenName Susan,initial B,familyName Jones,dateOfBirth 20000717 (a)(b)(c)第章 抽象语法表示ASN.
35、12.3 基本编码规则基本编码规则 2.3.1 2.3.1 简单编码简单编码基本编码规则(Basic Encoding Rule)把ASN.1表示的抽象类型值编码为字节串,这种字节串的结构为类型-长度-值,简称TLV(Type-Length-Value),而且值部分还可以递归地再编码为TLV结构,这样就具有了表达复杂结构的能力。第章 抽象语法表示ASN.1图2.3 传输语法的第一个字节标签标签值 0 简单类型 1 构造类型 00 UNIVERSAL 01 APPLICATION 10 CONTEXT SPECIFIC 11 PRIVATE第章 抽象语法表示ASN.1编码的第一个字节表示ASN.
36、1类型或用户定义的类型,其结构如图2.3所示。前两位用于区分4种标签;第三位用于区分简单类型和构造类型;其余5位表示标签的值,如果标签的值大于30,则这5位为全1,标签值表示在后续字节中。关于标签值字段扩充的方法稍后说明,这里先介绍几个简单编码例,其中的数值都是十六进制数。第章 抽象语法表示ASN.1例例2.12.1 布尔类型有两个值FALSE和TRUE,都用一个字节表示,FALSE是00,TRUE是FF。布尔类型是简单类型,标签为UNIVERSAL 1,因此FALSE编码为 01 01 00而TRUE编码为 01 01 FF其中第二个字节指明值部分的长度为1个字节。第章 抽象语法表示ASN.
37、1例例2.22.2 十进制数256的编码为 02 02 01 00最后两个字节表示十进制值256。第章 抽象语法表示ASN.1例例2.32.3 比特串10101的值在传输时要占用一个字节,5个比特靠左存放,右边3位未用,因此在比特串编码时要用一个字节说明未使用的比特数。于是对10101的编码为 03 02 03 A8第一个字节03表示类型为简单类型的比特串,02表示值部分为两个字节长,第三个字节03说明值部分的最后3个比特未用,最后的A8是值部分。第章 抽象语法表示ASN.1例例2.4 字节串字节串ACE可编码为可编码为 04 02 AC E0 由于字节串总是占用整数个字节,因而不必说明未占用
38、的比特数。没有说明值的位都认为是0,故最后一个字节写为E0,可见字节串类型也遵循靠左存放的原则。第章 抽象语法表示ASN.1例例2.52.5 NULL类型只有一个值,也写做NULL,其标签是UNIVERSAL 5。由于这个类型是空类型,无需存储或传送它的值,因而编码为 05 00第二个字节00表示值长度为0。第章 抽象语法表示ASN.1例例2.62.6 序列类型SEQUENCEmadeofwood BOOLEAN,length INTEGER的值 madeofwood TRUE,length 62可编码为 30 06 01 01 FF 02 01 3E按照序列的结构可展开如下:Seq Len
39、Val30 06 Bool Len Val 01 01 FF Int Len Val 02 01 3E 第章 抽象语法表示ASN.1例2.7 集合类型SETbreadth INTEGER,bent BOOLEAN的值breadth 7,bent FALSE可编码为 31 06 02 01 07 01 01 00由于集合类型的元素是无序的,因而也可以编码为 31 06 01 01 00 02 01 07第章 抽象语法表示ASN.1例2.8 这个例子说明应用标签的使用。假设我们设计一个安全协议,在这个应用中我们定义了一个口令字类型,并赋予应用标签27:Password:=APPLICATION 2
40、7 OCTET STRING对于这个类型的一个值“Sesame”,可得到如下编码:7B 08 04 06 53 65 73 61 6D 65展开后为 App Len Val 7B 08 Oct Len Val 04 06 53 65 73 61 6D 65 S e s a m e第章 抽象语法表示ASN.1显然,应用标签和字节串标签都编码了,因此它是构造类型。为了减少编码中的冗余信息,可使用隐含标签,重新定义如下:Password:=APPLICATION 27 IMPLICIT OCTET STRING则相应的编码为 5B 06 53 65 73 61 6D 65从第一个字节看出它变为简单类
41、型了,因为只有一种类型信息。第章 抽象语法表示ASN.12.3.2 字段扩充字段扩充 有两种字段需要扩充,一是当标签值大于30时类型字节需要扩充,二是当值部分大于一个字节的表示范围时长度字节需要扩充。对标签值的扩充方法如下:我们用5位表示030的编码,当标签值大于等于31时这5位置全1,作为转义符,实际的标签值编码表示在后续字节中。后续字节的左边第一位表示是否为最后一个扩充字节,只有最后一个扩充字节的左边第一位置0,其余扩充字节的左边第一位置1。这样,每个扩充字节只用了7位表示标签值的编码,可表示为下面的形式:第章 抽象语法表示ASN.100000 1111011111 用后续字节表示标签值表
42、示标签值030例如,标签值10110010101111001可编码为 11111 10000101 11001010 01111001第章 抽象语法表示ASN.1对长度字节的扩充方法是:小于127的数用长度字节的右边7位表示,最左边的一位置0。大于等于127的数用后续若干字节表示,原来的长度字节第一位置1,其余7位指明后续用于表示长度的字节数,即采用下面的形式:00000000 011111101 表示0126 指明后续用于表示长度的字节数 第章 抽象语法表示ASN.1 例如,25510可表示为 10000001 11111111值得注意的是,长度字节可表示的最大值为126,而不是127,值1
43、27是为以后扩充保留的。按照以上规则,可以把图2.2表示的个人记录编码为图2.4所示的比特串。第章 抽象语法表示ASN.1T L V(PersonalRecord)60 8185 T L V(Name)1A 04 John1A 01 P1A 05 SmithT L V(Title)A0 0A T L V (VisibleString)1A 08 DerectorT L V(EmployeeNumber)42 01 33T L V(DateOfHire)A1 0A T L V(Date)43 08 19710917T L V (NameOfSpouse)A2 12 T L V(Name)61 1
44、0 T L V(VisibleString)1A 04 MaryT L V(VisibleString)1A 01 TT L V(VisibleString)1A 05 SmithT L V(Children)A3 42 T L V(Set)31 1F T L V(Name)61 11 T L V(VisibleString)1A 05 RalphT L V(VisibleString)1A 01 TT L V(VisibleString)1A 05 SmithT L V(DateOfBirth)A0 0A T L V(Date)43 08 19981111A3 42 T L V(Set)31
45、 1F T L V(Name)61 11 T L V(VisibleString)1A 05 SusanT L V(VisibleString)1A 01 BT L V(VisibleString)1A 05 JonesT L V(DateOfBirth)A0 0A T L V(Date)43 08 2000071760 10 T L V(VisibleString)T L V(VisibleString)T L V(VisibleString)图2.4 个人记录的编码第章 抽象语法表示ASN.12.4 ASN.1宏定义宏定义 2.4.1 2.4.1 模块定义模块定义ASN.1中的模块类似于C
46、语言中的结构,用于定义一个抽象数据类型。可以用名字引用一个已定义的模块,例如模块定义了一个抽象语法,应用实体把模块名传送给表示服务,说明其APDU的格式。模块定义的基本形式为 DEFINITIONS:=BEGIN EXPORTS IMPORTS AssignmentList END 第章 抽象语法表示ASN.1其中的modulereference是模块名,可以跟随对应的对象标识符。EXPORTS构造指明该模块可以出口的部分,而IMPORTS构造指明该模块需要引用的其他类型和值。AssignmentList部分包含模块定义的所有类型、值和宏定义。下面是一个模块定义的例子:LanNetworkMo
47、duleiso org dod internet private enterprises Xenterprises 95DEFINITIONS EXPLICIT TAGS:=BEGIN EXPORTS LanNetworkName:=SEQUENCE OF RelativeDistinguishedName-End of EXPORTS IMPORTS 第章 抽象语法表示ASN.1RelativeDistinguishedName FROM InformationFrameworkioint-iso-ccitt Ds(5)modules(1)informationFramework(1)-En
48、d of IMPORTS MacAddresses:=OCTET STRING(SIZE(6)LanWorkstationSerialNumbers:=OCTET STRING(SIZE(32)LanSegment:=SET OF LanWorkstationSerialNumbers EthernetNetworks:=SET OF MacAddresses TokenRingNetworks:=SET OF LanSegment LanNetwork:=SET etherNet 0 IMPLICIT EthernetNetworks,tokenNet 1 IMPLICIT TokenRin
49、gNetworks END 第章 抽象语法表示ASN.12.4.2 2.4.2 宏表示宏表示这一小节介绍定义宏的方法,为此我们需要区分以下3个不同的概念。宏表示:ASN.1提供的一种表示机制,用于定义宏;宏定义:用宏表示定义的一个宏,代表一个宏实例的集合;宏实例:用具体的值代替宏定义中的变量而产生的实例,代表一种具体的类型。第章 抽象语法表示ASN.1宏定义的一般形式如下:MACRO:=BEGIN TYPE NOTATION:=VALUE NOTATION:=END 第章 抽象语法表示ASN.1其中的macroname后是宏的名字,必须全部大写。宏定义由类型表示(TYPE NOTATION)、
50、值表示(VALUE NOTATION)和支持产生式(supporting-productions)3部分组成,而最后一部分是任选的。这3部分都由Backus-Naur范式说明。当用一个具体的值代替宏定义中的变量或参数时就产生了宏实例,它表示一个实际的ASN.1类型(叫做返回的类型),并且规定了该类型可取的值的集合(叫做返回的值)。可见宏定义可以看作是类型的类型,或者说是超类型。另一方面,也可以把宏定义看作是类型的模板,可以用这种模板制造出形式相似、语义相关的许多数据类型,这就是宏定义的主要用处。第章 抽象语法表示ASN.1下面是取自RFC 1155的关于对象类型的宏定义,其中包含两个支持产生式