《抽象语法表示》PPT课件.ppt

上传人:小飞机 文档编号:5515606 上传时间:2023-07-15 格式:PPT 页数:73 大小:641.50KB
返回 下载 相关 举报
《抽象语法表示》PPT课件.ppt_第1页
第1页 / 共73页
《抽象语法表示》PPT课件.ppt_第2页
第2页 / 共73页
《抽象语法表示》PPT课件.ppt_第3页
第3页 / 共73页
《抽象语法表示》PPT课件.ppt_第4页
第4页 / 共73页
《抽象语法表示》PPT课件.ppt_第5页
第5页 / 共73页
点击查看更多>>
资源描述

《《抽象语法表示》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《抽象语法表示》PPT课件.ppt(73页珍藏版)》请在三一办公上搜索。

1、第章 抽象语法表示ASN.1,2.1 网络数据表示 2.2 ASN.1的基本概念 2.3 基本编码规则 2.4 ASN.1宏定义 习题,表示层的功能是提供统一的网络数据表示。在互相通信的端系统中至少有一个应用实体(例如FTP、TELNET、SNMP等)和一个表示实体(即ASN.1)。表示实体定义了应用数据的抽象语法,这种抽象语法类似于通常程序设计语言定义的抽象数据类型。应用协议按照预先定义的抽象语法构造协议数据单元,用于和对等系统的应用实体交换信息。表示实体则对应用层数据进行编码,将其转换成二进制的比特串,例如把十进制数变成二进制数、把字符变成ASCII码等。比特串由下面的传输实体在网络中传送

2、。把抽象数据变换成比特串的编码规则叫做传输语法。在各个端系统内部,应用数据被映像成本地的特殊形式,存储在磁盘上或显示在用户终端上,如图2.1所示。,2.1 网络数据表示,图2.1 关于信息表示的通信系统模型,特别需要指出的是,这里提到的抽象语法是独立于任何编码技术的,只与应用有关。抽象语法要能满足应用的需要,能够定义应用需要的数据类型和表示这些类型的值。ASN.1是根据当前网络应用的需求制定的标准(CCITT X.208和ISO 8824),也许随着网络应用的发展,还会开发出新的表示层标准。另外值得一提的是,对应一种抽象语法可以选择不止一种传输语法。对传输语法的基本要求是支持对应的抽象语法,另

3、外还可以有其他一些属性,例如支持数据加密或压缩,或者两者都支持。,2.2 ASN.1的基本概念,作为一种形式语言,ASN.1有严格的BNF定义。我们不想全面研究它的BNF定义,而是自底向上地解释ASN.1基本概念,然后给出一个抽象数据类型的例子。下面列出ASN.1文本的书写规则,这些规则叫做文本约定(Lexical Conventions):(1)书写的布局是无效的,多个空格和空行等效于一个空格;(2)用于表示值和字段的标识符、类型指针(类型名)和模块名由大小写字母、数字和短线(Hyphen)组成;,(3)标识符以小写字母开头;(4)类型指针和模块名以大写字母开头;(5)ASN.1定义的内部类

4、型全部用大写字母表示;(6)关键字全部用大写字母表示;(7)注释以一对短线(-)开始,以一对短线或行尾结束。,2.2.1 抽象数据类型在ASN.1中,每一个数据类型都有一个标签(Tag),标签有类型和值(见表2.1),数据类型是由标签的类型和值惟一决定的,这种机制在数据编码时有用。标签的类型分为以下4种:通用标签:用关键字UNIVERSAL表示,带有这种标签的数据类型是由标准定义的,适用于任何应用;应用标签:用关键字APPLICATION表示,是由某个具体应用定义的类型;上下文专用标签:这种标签在文本的一定范围(例如一个结构)中适用;,私有标签:用关键字PRIVATE表示,这是用户定义的标签。

5、ASN.1定义的数据类型有20多种,标签类型都是UNIVERSAL,如表2.1所示。这些数据类型可分为4大类。简单类型:由单一成分构成的原子类型;构造类型:由两种以上成分构成的构造类型;标签类型:由已知类型定义的新类型;其他类型:包括CHOICE和ANY两种类型。,表2.1 ASN.1定义的通用类型,表2.1 ASN.1定义的通用类型,1.简单类型 表2.1中除了UNIVERSAL 16和UNIVERSAL 17之外都是简单类型。这些类型的共同特点是可以直接定义它们的值的集合,可以把这些类型作为原子类型构造新的数据类型。简单类型还可以分为4组。第一组包括BOOLEAN、INTEGER、BIT

6、STRING、OCTET STRING、REAL和ENUMERATED等。这一组可以叫做基本类型,它们的值已经在表2.1中列出了。需要说明的是,实数可以表示为科学计数法:,M BE,其中尾数M和指数E可以取任何正/负整数值,基数B可取2或10。枚举类型ENUMERATED是一个整数的表,每一个整数有一个名字。与此类似的是,对于某些整数类型的值也可以定义一个名字,但这两种类型是有区别的。对整数可以进行算术运算,但对枚举类型却不能进行任何算术运算,也就是说,枚举类型的值只是用整数表示的一个符号,而不具有整数的性质。下面是定义枚举类型和定义整数类型的例子:EthernetAdapterStatus:

7、=ENUMERATEDnormal(0),degraded(1),offline(2),failed(3)EthernetNumberCollisionsRange:=INTEGERminimum(0),maximum(1000),在ASN.1中,用符号:=表示产生式,读做“定义为”。显然,EthernetNumberCollisions Range类型的变量只能取两个整数值:0和1000。第二组包括各种字符串类型,标签为UNIVERSAL 1822和UNIVERSAL 2527,这些类型都可以看作是OCTET STRING类型的子集,它们都是采纳其他标准的类型。,第三组包括OBJECT ID

8、ENTIFIER和Object Descriptor两种类型。我们用对象类型泛指网络中传输的任何信息对象,例如标准文档、抽象语法和传输语法、数据结构和管理对象等都可以归入信息对象范畴。OBJECT IDENTIFIER类型的值是一个对象标识符,由一个整数序列组成,它惟一地标识一个对象。对象描述符(Object Descriptor)则以人工可读的形式描述信息对象的语义。,第四组包含4种类型。NULL是空类型,它没有值,只占用结构中的一个位置,该位置可能出现或不出现数据。EXTERNAL是外部类型,即标准之外的文档定义的类型。UTCTime和GeneralizedTime是两种有关时间的类型,其

9、区别是表示时间的形式不同。前者(世界通用时)分别用两位数字表示年、月和日(即YYMMDD),然后是时、分和秒(即hhmmss),最后可以说明是否为本地时间;而后者用4位数字表示年,用两位数字表示月和日,最后也可以说明是否为本地时间。例如20000721182053.7是GeneralizedTime类型的一个值,表示2000年7月21日,当地时间18点20分53.7秒。而值20000721182053.7Z表示同样的时间,但是加了符号Z,则表示UTC时间。如果写为20000721182053.7+0800则除了表示同样的当地时间外,还说明了加8小时可以得到UTC时间。,2.构造类型构造类型有序

10、列和集合两种,分别用SEQUENCE和SEQUENCE OF表示不同类型和相同类型元素的序列,分别用SET和SET OF表示不同类型和相同类型元素的集合。序列和集合的区别是前者的元素是有序的,而后者是无序的。我们可以定义任何已知类型的序列,定义序列的语法是:,SequenceType:=SEQUENCEElementTypeList|SEQUENCE ElementTypeList:=ElementType|ElementTypeList,ElementTypeElementType:=NamedType|NamedType OPTIONAL|NamedType DEFAULT Value|C

11、OMPONENTS OF Type,在这个表达式中,NamedType是一个类型指针。序列的每一成分类型可能跟随关键字OPTIONAL(表示任选)或DEFAULT(表示默认值)。COMPONENTS OF子句用于指示另外一个被包含的类型。定义SEQUENCE OF类型的语法如下:SequenceOfType:=SEQUENCE OF Type|SEQUENCE,下面是定义序列类型的例子:EthernetCollisionsCounter:=SEQUENCE highValue INTRGER,lowValueINTEGER TokenRingTokensLost:=SEQUENCE OF hi

12、ghValueINTRGER,lowValueINTEGER LanSimpleCounterLimits:=SEQUENCE ethernetCounter1 COMPONENTS OF EthernetCollisionsCounter,tokenRingCounter1COMPONENTS OF TokenRingTokensLost,定义SET和SET OF的语法是类似的:SetType:=SET ElementTypeList|SET SetOfType:=SET OF Type|SET,下面是定义集合类型的例子:LanWorkstationSerialNumbers:=OCTET

13、STRING(SIZE(32)LanSegment:=SET OF LanWorkstationSerialNumbersMacAddresses:=OCTET STRING(SIZE(6)EthernetNetworks:=SET OF MacAddressesTokenRingNetworks:=SET OF LanSegmentLanNetwork:=SET etherNet 0 IMPLICIT EthernetNetworks,tokenNet 1 IMPLICIT TokenRingNetworks,3.标签类型虽然ASN.1的所有类型都带有标签,但这里所谓的标签类型,是指应用或用

14、户加在某个类型上的标签。起码有两种情况需要给一个现有的类型加上标签:首先是一个类型可以有多个类型名,例如为了使语义更丰富,可能用Employee-name和Customer-name表示同一类型,这样可以给两者指定同一应用标签APPLICATION 0。另外,在一个结构类型(序列或集合)中,可以用上下文专用标签区分类型相同的元素。例如集合中有3个同样类型的元素,一个指本人的名字,一个指父亲的名字,另一个指母亲的名字,分别为其指定不同的上下文专用标签1、2和3以示区别,参见下例:,Parentage:=SETSubjectName1 IMPLICIT IA5String,MotherName 2

15、 IMPLICIT IA5String OPTIONAL,FatherName 3 IMPLICIT IA5String OPTIONAL,标签类型可以是隐含的或明示的,分别用关键字IMPLICIT和EXPLICIT(可省略)表示。隐含标签的语义是用新标签替换老标签,因此编码时只编码新标签。上例中,3个集合元素的上下文标签都是隐含的,因此编码时只编码上下文专用标签。明示标签的语义是在一个基类型上加上新标签,从而导出一个新类型。事实上,明示标签类型是把基类型作为惟一元素的构造类型,在编码时,新老标签都要编码,可见隐含标签可以产生较短的编码。但明示标签也是有用的,特别用于基类型未定时,例如基类型为

16、CHOICE或ANY类型。,4.其他类型CHOICE和ANY是两个没有标签的类型,因为它们的值是未定的,而且类型也是未定的。当这种类型的变量被赋值时,它们的类型和标签才确定,可以说标签是运行时间确定的。CHOICE是可选类型的一个表,仅其中一个类型可以被采用,产生一个值。事实上CHOICE类型是所有成分类型的联合,这些成分类型是已知的,但是在定义时尚未确定。CHOICE类型定义为ChoiceType:=CHOICEAlternativeTypeListAlternativeTypeList:=NamedType|AlternativeTypeList,NamedType,下面是定义CHOICE

17、类型的例子:EthernetAdapterNumber:=CHOICENULL,OCTET STRINGANY类型表示任意类型的任意值,与CHOICE类型不同之处在于实际出现的类型也是未知的,通常记为AnyType:=ANY|ANY DEFINED BY identifier例如,我们可以定义SoftwareVersion:=ANY或SoftwareVersion:=ANY DEFINED BY INTEGER,2.2.2 子类型子类型是由限制父类型的值集合而导出的类型,因此子类型的值集合是父类型的子集。子类型还可以再产生子类型。产生子类型的方法有6种,如表2.2所示。,表2.2 产生子类型的

18、方法,1.单个值这种方法就是列出子类型可取的各个值。例如,我们可以定义小素数为整数类型的子集:SmallPrime:=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),则可以定义First-quarter和Second-quarter为Months的子

19、类型:First-quarter:=Months(january,february,march)Second-quarter:=Months(april,may,june),2.包含子类型这里要用到关键字INCLUDES,说明被定义的类型包含了已有类型的所有的值。例如下面的定义:First-half:=Months(INCLUDES First-quarter|I NCLUDES Second-quarter)另外,也可以直接列出被包含的值,例如First-third:=Months(INCLUDES First-quarter|april),3.值区间这种方法只能应用于整数和实数类型,指出子

20、类型可取值的区间。在下面的定义中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),同理,下面4个定义也是等价的:NegativeInteger:=I

21、NTEGER(MINUS-INFINITY.0)NegativeInteger:=INTEGER(MINUS-INFINITY.-1)NegativeInteger:=INTEGER(MIN.0)NegativeInteger:=INTEGER(MIN.-1),4.可用字符这种方法只能用于字符串类型,限制可使用的字符集。下面是两个限制可用字符的例子:TouchToneButtons:=IA5String(FROM(0|1|2|3|4|5|6|8|9|*|#)DigitString:=IA5String(FROM(0|1|2|3|4|5|6|8|9),5.限制大小可以对5种类型限制其规模大小,例

22、如限制比特串、字节串或字符串的长度,限制构成序列或集合的元素(同类型)个数等。例如X.25(分组交换协议)公共数据网的地址由514个数字组成,这个规定可用下面的定义表示:It1DataNumber:=DigitString(SIZE(5.14)下面的定义说明一个参数表包含最多12个参数:ParameterList:=SET SIZE(0.12)OF Parameter,6.内部子类型这种方法可用于序列、集合和CHOICE类型。这是一种很复杂的子类型关系,下面用例子说明。假定有一种协议数据单元:PDU:=SETalpha0 INTEGER,beta 1 IA5String OPTIONAL,ga

23、mma2 SEQUENCE OF Parameter,delta3 BOOLEAN,下面定义的子类型测试协议数据单元要求布尔值必须是FALSE,整数值必须是负的:TestPDU:=PDU(WITH COMPONENTS.delta(FALSE),alpha(MIN.0)另外一个测试子类型要求beta参数必须出现,其值为5或12个字符组成的串:FurtherTestPDU:=TestPDU(WITH COMPONENTS.beta(SIZE 5|12)PRESENT),内部子类型还可以用于序列,例如:Text-block:=SEQUENCE OF VisibleStringAddress:=Te

24、xt-block(SIZE(1.6)|WITH COMPONENT(SIZE(1.32)这个例子说明地址包含16个Text-block,每一个Text-block包含132个字符。,2.2.3 数据结构示例下面是取自CCITT X.208的一个数据结构示例。图2.2(a)是关于个人记录的非形式描述,其中包括姓名、头衔、雇员编号、雇佣日期、配偶姓名和子女数等6项信息,而且对每个子女也要给出姓名和出生日期。图2.2(b)是用ASN.1描述个人记录的抽象语法。其中对雇员编号的定义为EmployeeNumber:=APPLICATION 2IMPLICIT INTEGER,其中,EmployeeNum

25、ber被定义为整数类型,而且加上了应用标签APPLICATION 2。IMPLICIT表示隐含的,因此编码时只编码应用标签,不必编码整数类型的标签UNIVERSAL 2。对Date类型的定义也是类似的,它被说明为ISO 646定义的字符串类型,注释YYYYMMDD提示了日期的书写格式。Name是序列类型,由3个元素组成,各个元素的名字分别为givenName、initial和 familyName。ChildInformation是集合类型,其中的第一个元素没有名字,只有类型。第二个元素的名字为dateOfBirth,其类型为Date。Date类型还出现在PersonnelRecord的定义中

26、,在这两个地方被分别赋予上下文专用的标签0和1。,最后,个人记录的整体结构被定义为含有6个元素的集合,该集合的最后一个成分为同类型元素的序列,默认值为空序列。ASN.1不仅提供了表示数据结构的手段,而且给出了表示抽象数据类型值的方法,图2.2(c)表示出个人记录的一个具体值。,图2.2 ASN.1表示的抽象语法(a)个人记录;(b)个人记录的抽象语法;(c)个人记录的一个值,2.3 基本编码规则,2.3.1 简单编码基本编码规则(Basic Encoding Rule)把ASN.1表示的抽象类型值编码为字节串,这种字节串的结构为类型-长度-值,简称TLV(Type-Length-Value),

27、而且值部分还可以递归地再编码为TLV结构,这样就具有了表达复杂结构的能力。,图2.3 传输语法的第一个字节,编码的第一个字节表示ASN.1类型或用户定义的类型,其结构如图2.3所示。前两位用于区分4种标签;第三位用于区分简单类型和构造类型;其余5位表示标签的值,如果标签的值大于30,则这5位为全1,标签值表示在后续字节中。关于标签值字段扩充的方法稍后说明,这里先介绍几个简单编码例,其中的数值都是十六进制数。,例2.1 布尔类型有两个值FALSE和TRUE,都用一个字节表示,FALSE是00,TRUE是FF。布尔类型是简单类型,标签为UNIVERSAL 1,因此FALSE编码为 01 01 00

28、而TRUE编码为 01 01 FF其中第二个字节指明值部分的长度为1个字节。,例2.2 十进制数256的编码为 02 02 01 00最后两个字节表示十进制值256。,例2.3 比特串10101的值在传输时要占用一个字节,5个比特靠左存放,右边3位未用,因此在比特串编码时要用一个字节说明未使用的比特数。于是对10101的编码为 03 02 03 A8第一个字节03表示类型为简单类型的比特串,02表示值部分为两个字节长,第三个字节03说明值部分的最后3个比特未用,最后的A8是值部分。,例2.4 字节串ACE可编码为,04 02 AC E0,由于字节串总是占用整数个字节,因而不必说明未占用的比特数

29、。没有说明值的位都认为是0,故最后一个字节写为E0,可见字节串类型也遵循靠左存放的原则。,例2.5 NULL类型只有一个值,也写做NULL,其标签是UNIVERSAL 5。由于这个类型是空类型,无需存储或传送它的值,因而编码为 05 00第二个字节00表示值长度为0。,例2.6 序列类型SEQUENCEmadeofwood BOOLEAN,length INTEGER的值 madeofwood TRUE,length 62可编码为 30 06 01 01 FF 02 01 3E按照序列的结构可展开如下:,Seq Len Val30 06 Bool Len Val 01 01 FF Int Le

30、n Val 02 01 3E,例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,例2.8 这个例子说明应用标签的使用。假设我们设计一个安全协议,在这个应用中我们定义了一个口令字类型,并赋予应用标签27:Password:=APPLICATION 27 OCTET STRING对于这个类型的一个值“Sesame”,可得到如下编码:7B 08 04 06 53 65 73 61

31、 6D 65展开后为 App Len Val 7B 08 Oct Len Val 04 06 53 65 73 61 6D 65 S e s a m e,显然,应用标签和字节串标签都编码了,因此它是构造类型。为了减少编码中的冗余信息,可使用隐含标签,重新定义如下:Password:=APPLICATION 27 IMPLICIT OCTET STRING则相应的编码为 5B 06 53 65 73 61 6D 65从第一个字节看出它变为简单类型了,因为只有一种类型信息。,2.3.2 字段扩充 有两种字段需要扩充,一是当标签值大于30时类型字节需要扩充,二是当值部分大于一个字节的表示范围时长度字

32、节需要扩充。对标签值的扩充方法如下:我们用5位表示030的编码,当标签值大于等于31时这5位置全1,作为转义符,实际的标签值编码表示在后续字节中。后续字节的左边第一位表示是否为最后一个扩充字节,只有最后一个扩充字节的左边第一位置0,其余扩充字节的左边第一位置1。这样,每个扩充字节只用了7位表示标签值的编码,可表示为下面的形式:,例如,标签值可编码为 11111 10000101 11001010 01111001,对长度字节的扩充方法是:小于127的数用长度字节的右边7位表示,最左边的一位置0。大于等于127的数用后续若干字节表示,原来的长度字节第一位置1,其余7位指明后续用于表示长度的字节数

33、,即采用下面的形式:,例如,25510可表示为 10000001 11111111值得注意的是,长度字节可表示的最大值为126,而不是127,值127是为以后扩充保留的。按照以上规则,可以把图2.2表示的个人记录编码为图2.4所示的比特串。,图2.4 个人记录的编码,2.4 ASN.1宏定义,2.4.1 模块定义ASN.1中的模块类似于C语言中的结构,用于定义一个抽象数据类型。可以用名字引用一个已定义的模块,例如模块定义了一个抽象语法,应用实体把模块名传送给表示服务,说明其APDU的格式。模块定义的基本形式为 DEFINITIONS:=BEGIN EXPORTS IMPORTS Assignm

34、entList END,其中的modulereference是模块名,可以跟随对应的对象标识符。EXPORTS构造指明该模块可以出口的部分,而IMPORTS构造指明该模块需要引用的其他类型和值。AssignmentList部分包含模块定义的所有类型、值和宏定义。下面是一个模块定义的例子:,LanNetworkModuleiso org dod internet private enterprises Xenterprises 95DEFINITIONS EXPLICIT TAGS:=BEGIN EXPORTS LanNetworkName:=SEQUENCE OF RelativeDistin

35、guishedName-End of EXPORTS IMPORTS,RelativeDistinguishedName FROM InformationFrameworkioint-iso-ccitt Ds(5)modules(1)informationFramework(1)-End of IMPORTS MacAddresses:=OCTET STRING(SIZE(6)LanWorkstationSerialNumbers:=OCTET STRING(SIZE(32)LanSegment:=SET OF LanWorkstationSerialNumbers EthernetNetwo

36、rks:=SET OF MacAddresses TokenRingNetworks:=SET OF LanSegment LanNetwork:=SET etherNet 0 IMPLICIT EthernetNetworks,tokenNet 1 IMPLICIT TokenRingNetworks END,2.4.2 宏表示这一小节介绍定义宏的方法,为此我们需要区分以下3个不同的概念。宏表示:ASN.1提供的一种表示机制,用于定义宏;宏定义:用宏表示定义的一个宏,代表一个宏实例的集合;宏实例:用具体的值代替宏定义中的变量而产生的实例,代表一种具体的类型。,宏定义的一般形式如下:MACRO

37、:=BEGIN TYPE NOTATION:=VALUE NOTATION:=END,其中的macroname后是宏的名字,必须全部大写。宏定义由类型表示(TYPE NOTATION)、值表示(VALUE NOTATION)和支持产生式(supporting-productions)3部分组成,而最后一部分是任选的。这3部分都由Backus-Naur范式说明。当用一个具体的值代替宏定义中的变量或参数时就产生了宏实例,它表示一个实际的ASN.1类型(叫做返回的类型),并且规定了该类型可取的值的集合(叫做返回的值)。可见宏定义可以看作是类型的类型,或者说是超类型。另一方面,也可以把宏定义看作是类型

38、的模板,可以用这种模板制造出形式相似、语义相关的许多数据类型,这就是宏定义的主要用处。,下面是取自RFC 1155的关于对象类型的宏定义,其中包含两个支持产生式:OBJECT-TYPE MACRO:=BEGIN TYPE NOTATION:=Syntax type(TYPE ObjectSyntax)ACCESS Access STATUS Status VALUE NOTATION:=value(VALUE ObjectName)Access:=read-only|read-write|write-only|not-accessible Status:=mandatory|optional|

39、obsolete END,2.4.3 宏定义示例关于为什么要用宏定义,我们通过一个比较深入的例子来说明。假设我们经常需要使用整数对,于是我们定义一个ASN.1类型:Pair-integers:=SEQUENCE(INTEGER,INTEGER)如果我们还需要使用字节串对,也可以定义相应的类型:Pair-octet-string:=SEQUENCE(OCTET STRING,OCTET STRING),进一步假设我们可能需要使用各种各样的数对,例如实数-实数对、整数-实数对、整数-字节串对、实数-布尔型对等,甚至数对中的一个成分还可能是另外一个数对或其他具有复杂构造的成分。是否必须定义这许多数对

40、类型呢?答案是否定的。简化类型定义的方法是使用宏定义。我们定义一个宏PAIR,它是一个类型对:PAIR TYPE-X=type TYPE-Y=type,对应的值表示采用下面的形式:(X=value,Y=value)用一个已有的类型代替其中的变量type,可得到宏实例,即新的类型:T1:=PAIR TYPE-X=INTEGER TYPE-Y=BOOLEANT2:=PAIR TYPE-X=VisibleString TYPE-Y=T1则下面的值属于T1类型:(X=3,Y=TRUE),下面的值是T2类型:(X=Name,Y=(X=4,Y=FALSE)显然,只要用已知的类型代替关键字type,就可以得

41、到需要的数对类型。图2.5给出了PAIR的宏定义,关于其中的表示方法说明如下:(1)加引号的字符串在宏实例中保持不变,它的作用是指明类型变量的位置。(2)可以用任何ASN.1类型名代替变量Local-type-1和Local-type-2,从而产生一个代表新类型的宏实例。关键字type指明了实施这种替换的位置。,(3)在任何宏实例中,Local-value-1位置包含一个Local-type-1类型的值,同理Local-value-2位置包含一个Local-type-2类型的值,这就是新类型的值。(4)关键字VALUE用于指明一个位置,其后紧跟的类型就是值的类型,亦即对宏定义产生的任何值必须按照这种类型编码,本例中值的类型是SEQUENCE。,图2.5 宏定义示例,习 题,1.表示层的功能是什么?抽象语法和传输语法各有什么作用?2.用ASN.1表示一个协议数据单元(例如IEEE 802.3的帧)。3.用基本编码规则对长度字段L编码:L=18,L=180,L=1044。4.用基本编码规则对下面的数据编码:标签值=1011001010,长度=255。5.为什么要用宏定义?怎样由宏定义得到宏实例?,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号