asn.1应用类型 是简单类型还是构造数据类型类型

传输数据时,接收方要明确知道每个收到的数据的类型,我们就要对各类型进行系统性的编号。在ASN.1中使用Tag来唯一标识数据的类型。
(1).分配给每个类型的tag实际上是一个值对:&taggingclass,
number&。有四种taggingclass:UNIVERSAL,APPLICATION,context-specific和PRIVATE,分别用00、01、10、11表示。在一个上下文中,如果TaggingClass不同,则相同number的两个Tag也是不同的。
&1&.UNIVERSAL的Tag是ASN.1标准定义的,在描述中不能修改。
&2&.context-specificTag是对SEQUENCE、SET和CHOICE及其成员使用的,可以在描述中自己定义,只要不产生歧义,相同数值可以在不同结构中反复使用。如:
A-possible-type::= SET
integer[0] CHOICE
a[0] INTEGER,
b[1] INTEGER
boolean[1] CHOICE
a[0] BOOLEAN,
b[1] BOOLEAN
SET在ASN.1中定义的Tag值是17,上例的用户定义的类型A-possible-type有两个成员,分别用[0],[1]标识。这两个成员又各自包含两个成员,同样在自已的范围内用[0],[1]。
&3&.APPLICATION和PRIVATE已经不推荐使用。
2.IMPLICIT tagging和EXPLICITtagging
&1&. IMPLICIT
看一个例子:
overseas [1]IMPLICIT SEQUENCE
nameUTF8String,
typeOutletType,
locationAddress
该类型编码后,Tag[1]会覆盖掉SEQUENCE的默认类Tag[16],具体格式:
oversears是SEQUENCE类型,默认Tag应该是16,这里使用了关键字'IMPLICIT',将其覆盖为1,
CHIOCE类型不能用IMPLICIT模式,例:
warehouse[2] IMPLICIT CHOICE
northern[0] NULL,
southern[1] NULL
CHIOCE类型在编码时只有一个TLV,即northern或southern中的一个,使用IMPLICIT,[0]或[1]会覆盖掉[2]
在下面的情况中,warehouse取southern时,就会导致details两个成员的Tag都是[1]:
detailsSET
overseas[1] SEQUENCE
nameUTF8String,
typeOutletType,
locationAddress
warehouse[2] IMPLICIT CHOICE
northern[0] NULL,
southern[1] NULL
因此,CHOICE类型只能用显式Tag
&2&. EXPLICIT
如果一个类型的Tag是显式(EXPLICIT)的(或者在模块定义中声明了EXPLICITTAGS),则要以constructed方式编码三元组系列。
前面的CHOICE可用显式Tag
warehouse[2] EXPLICIT CHOICE
northern[0] NULL,
southern[1] NULL
3.全局Tag模式
模块定义时,可以声明模块全局Tag模式。可以是EXPLICITTAGS、IMPLICITTAGS和AUTOMATICTAGS。
EXPLICITTAGS/IMPLICITTAGS:模块内所有SEQUENCE、SET都是EXPLICIT或IMPLICIT模式,但不影响IMPORTS的内容。
AUTOMATICTAGS:模块内所有SEQUENCE、SET类型ASN.1编译器会自动从0开始,步长为1进行自动编码。而其中的成员则用IMPLICIT模式。
CHOICE类型在以上情况都会自动被指定为EXPLICIT模式。
二.ASN.1结构类型(组合类型)
1.SEQUENCE
SEQUENCE是一组简单类型的有序集合,它可以嵌套使用,还可以使用OPTIONAL、DEFAULT和COMPONENTSOf等对成员进行修饰。
常见的声明如:
Description::= SEQUENCE
surname IA5String,
first-nameIA5String,
ageINTEGER
该类型的一个值为:
johnnyDescription ::=
surname&Smith&,
first-name&John&,
注意最后一个成员后没有','
与SEQUENCE一样,SET也是是一组简单类型集合,不同处是他的成员是无序的,没有先后关系。
3.SEQUENCEOf与STEOF
SEQUENCEOF相当于某些语言中的动态数组或者列表:所有成员都是一个类型,数目不定。如:
SteepleChase::= SEQUENCE OF INTEGER
他的取值格式是:
winningCombinationSteepleChase ::= {5, 2, 12}
no-one-arrivedSteepleChase ::= { }
STEOF和SEQUENCEOF相比,SETOf的成员是顺序的,其它类似。
4.CHOICE类型
CHOICE类型表示一种选择,类似UNION。和SEQUENCE、SET类型不同,CHOICE没有缺省的UNIVERSALTag值,因为它是一些类型的集合,其中被选择项目的Tag会被作为CHOICE相关Tag。
三.类型扩展
在定义中插入扩展标记“…”来定义一个类型是可扩展的。在ASN.1中可扩展的类型有ENUMERATED、
SEQUENCE、SET和CHOICE。如:
State::= ENUMERATED {on, off, out-of-order, ...}
Description::= SEQUENCE
surnameIA5String,
first-nameIA5String,
ageINTEGER,
扩展标记可以有两个,他们将类型定义分割为两个扩展部分,在扩展时,新增的项目可能有多个,并且其中可能还带有OPTIONAL和DEFAULT。这种情况下,解码器在解码中就会遇到困难。为了区分不同版本,在扩展部分,可以使用版本符号“[[]]”,如:
Afters::= CHOICE
cheeseIA5String,
dessertIA5String,
...!IA5String:&dimensionerror&,
[[coffeeNULL ]], -- version 2
[[cognacIA5String]] -- version 3
如果扩展部分只有一个成员,则版本符号可以省略。如:
Afters::= CHOICE
cheeseIA5String,
dessertIA5String,
...!IA5String:&dimensionerror&,
coffeeNULL, -- version 2
同一个版本扩展也可以添加多个成员,例:
Afters::= CHOICE
cheeseIA5String,
dessertIA5String,
...!IA5String:&dimensionerror&,
[[coffeeNULL,
coke&NULL]]-- version 2
当解码器发现没有预期的扩展或出现不预期的扩展时,为了能够正常工作,我们一般会事先规定忽略不期望的扩展,并为期望的扩展赋默认值。
解码器还会以事先约定的信号通知应用层。这个约定的信号就是异常Exception,在抽象语法中以“!”开头,后接一个值(可以是数、字符串等),放在扩展标记之后。上面例子中,解码器会通知应用层&dimensionerror&错误。
1.单值约束
单值约束是最简单的约束,即将一个类型限制为一个值,如:
Two::= INTEGER (2)
Day::= ENUMERATED
monday(0),tuesday(1), wednesday(2), thursday(3), friday(4), saturday(5),sunday(6)
Day::= IA5String(“monday”|“tuesday”|“wednesday”|“thursday”|“friday”|“saturday”|“sunday”|)
2.类型包含约束
当声明一个类型和另一个类型拥有,只需要将被参考类型列出,如
WeekEnd::= Day (saturday|sunday)
FrenchWeekEnd::= Day (WeekEnd)
3.值域约束
From3to15::= Number (3..15)&取整数3-15任意一个
Upcase::= IA5String('A'..'Z')&取ASCII码A-Z任意一个
4.大小约束
Exactly31BitsString::= BIT STRING (SIZE (31))长度固定为31
Exactly31BitsString::= BIT STRING (SIZE (1..31))长度范围是1-31
5.正则表达约束
通过关键字PATTERN来约束字符串:
DateAndTime::= VisibleString(PATTERN &\d#2/\d#2/\d#4-\d#2:\d#2&)
--DD/MM/YYYY-HH:MM
#n表示重复前一个表达式n次,/d不知道什么含义。
6.SEQUENCEOF或者SETOf成员的约束
AddressBlock::= SEQUENCE OF VisibleString (SIZE (1..32))
表示&VisibleString字串的长度是1到32个字符。
以下是对SEQUENCEOF类型本身的约束,表示该有序列可以有1到32个VisibleString字符串。
AddressBlock::= SEQUENCE (SIZE (1..32)) OF VisibleString
7.SEQUENCE、SET和CHOICE成员的约束
对于SEQUENCE和SET多个成员进行约束,我们使用WITHCOMPONENTS来添加约束,注意关键字结尾有S
Quadruple::= SEQUENCE
alphaENUMERATED {state1, state2, state3},
betaIA5String OPTIONAL,
gammaSEQUENCE OF INTEGER,
deltaBOOLEAN DEFAULT TRUE
添加约束后为:
Quadruple1::= Quadruple (WITH COMPONENTS
alpha(state1),
gamma(SIZE (5))
注意括号;符号“…”指示只对显式声明的成员进行约束,其它成员不变。
8.对OCTETSTRING内容的约束
可以使用CONTAINING和ENCODEDBY指定OCTETSTRING的内容和编码,如:
MoreCompact ::=OCTET STRING (CONTAINING MyType ENCODED BY {joint-iso-itu-t asn1packed-encoding(3) basic(0) unaligned(1)})
MyType::= SEQUENCE { -- ....... -- }
这里明确指定了OCTETSTRING的内容是MyType并且使用PER进行编码。
9.约束的组合
可以将前面所述的各种约束适当组合,得到更为准确的描述,如:
PhoneNumber ::=NumericString (FROM (&0&..&9&))(SIZE (10))描述电话号码
10.自定义约束
可以通过关键字CONSTRAINEDBy来引入自定义约束,它通常都会在编解码过程中引入特定的处理。
五.上下文交换类型
1.EXTERNAL类型
不推荐使用。可以用EMBEDDEDPDV类型替代。
2.EMBEDDEDPDV类型
EMBEDDEDPDV类型等效于:
EMBEDDEDPDV ::= [UNIVERSAL 11] IMPLICIT SEQUENCE
identificationCHOICE
syntaxes SEQUENCE
abstractOBJECT IDENTIFIER,
transferOBJECT IDENTIFIER
syntaxOBJECT IDENTIFIER,
presentation-context-idINTEGER,
context-negotiationSEQUENCE
presentation-context-idINTEGER,
transfer-syntaxOBJECT IDENTIFIER
transfer-syntaxOBJECT IDENTIFIER,
data-valueOCTET STRING
EMBEDDEDPDV是一种专门用于通讯的基本类型,其中:
syntaxes(注意有s)表征编码规则中抽象语法和传输语法的对象标识;
syntax表征抽象语法和编码规则;
presentation-context-id是协商后的表示上下文(只用于OSI环境中,即一对抽象语法和传输语法);context-negotiation用于表示上下文协商,可能在连接建议开始或者连接过程中上下文修改;
transfer-syntax。此时,抽象语法应该是应用设计者固定采用的方式,并且发送、接收双方都已明确;
fixed表明发送、接收双方都已知道抽象语法和传输语法。
3.CHARACTERSTRING类型
CHARACTERSTRING是EMBEDDEDPDV的一个具体应用,在一些特殊场合下的字符串类型,可能不想如前述标准类型那样采用标准的编码方式,而是希望其字符抽象语法和字符传输语法能在通讯系统标识层间协商或者在环境合适时直接使用字符串。
六.信息对象类、信息对象和信息对象集合
这部分没看明白,资料中模糊的地方太多,先放一边
七.宏Macro
自1994版本标准后,宏Macro已经被信息对象类和信息对象取代了。
本文已收录于以下专栏:
相关文章推荐
一.基本规则
BER(BasicEncoding Rules)是ASN.1中最早定义的编码规则,其他编码规则是在BER的基础上添加新的规则构成。
1.BER传输语法的格式一直...
1.1 PKCS#1签名
被签名的数据为字节数组。对给出的被签名原数据进行Hash运算,Hash结果按PKCS#1标准进行填充:
B = 00 01 ff ff … ff 00 30 … H[00...
一.基本规则
BER(BasicEncoding Rules)是ASN.1中最早定义的编码规则,其他编码规则是在BER的基础上添加新的规则构成。
1.BER传输语法的格式一直是TLV...
{margin-bottom:0.21cm}
{margin-bottom:0.21cm}
h2.western
{font-family:&DejaVu San...
一.ASN.1基本类型
基本类型汇总表
UNIVERSALTag
TRUE,FALSE
1.ASN.1概述
    抽象语法表示(标记)ASN.1(Abstract Syntax Notation One )一种数据定义语言,描述了对数据进行表示、编码、传输和解码的数据格式。网络管理系...
通信时,要确保对方知道每个
传输数据时,接收方要明确知道每个收到的数据的类型,我们就要对各类型进行系统性的编号。在ASN.1中使用Tag来唯一标识数据的类型。
(1).分配给每个类型的tag实际上是...
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)该商品已下柜,非常抱歉!
抽象语法记法ASN.1原理与应用
商品介绍加载中...
扫一扫,精彩好书免费看
服务承诺:
京东平台卖家销售并发货的商品,由平台卖家提供发票和相应的售后服务。请您放心购买!
注:因厂家会在没有任何提前通知的情况下更改产品包装、产地或者一些附件,本司不能确保客户收到的货物与商城图片、产地、附件说明完全一致。只能确保为原厂正货!并且保证与当时市场上同样主流新品一致。若本商城没有及时更新,请大家谅解!
权利声明:京东上的所有商品信息、客户评价、商品咨询、网友讨论等内容,是京东重要的经营资源,未经许可,禁止非法转载使用。
注:本站商品信息均来自于合作方,其真实性、准确性和合法性由信息拥有者(合作方)负责。本站不提供任何保证,并不承担任何法律责任。
印刷版次不同,印刷时间和版次以实物为准。
价格说明:
京东价:京东价为商品的销售价,是您最终决定是否购买商品的依据。
划线价:商品展示的划横线价格为参考价,该价格可能是品牌专柜标价、商品吊牌价或由品牌供应商提供的正品零售价(如厂商指导价、建议零售价等)或该商品在京东平台上曾经展示过的销售价;由于地区、时间的差异性和市场行情波动,品牌专柜标价、商品吊牌价等可能会与您购物时展示的不一致,该价格仅供您参考。
折扣:如无特殊说明,折扣指销售商在原价、或划线价(如品牌专柜标价、商品吊牌价、厂商指导价、厂商建议零售价)等某一价格基础上计算出的优惠比例或优惠金额;如有疑问,您可在购买前联系销售商进行咨询。
异常问题:商品促销信息以商品详情页“促销”栏中的信息为准;商品的具体售价以订单结算页价格为准;如您发现活动商品售价或促销信息有异常,建议购买前先联系销售商咨询。
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
浏览了该商品的用户还浏览了
加载中,请稍候...
价 格: 到
   
iframe(src='///ns.html?id=GTM-T947SH', height='0', width='0', style='display: visibility:')ASN.1/BER/DER编码子集入门指南(二)
前接文档请参见:ASN.1/BER/DER编码子集入门指南(一)2.&抽象语法标记(Abstract&Syntax&Notation&One)&&&&抽象语法标记(Abstract&Syntax&Notation&One)是描述抽象类型和值的标记,缩写为ASN.1。&&&&在ASN.1中,一个类型就是值的一个集合。有些类型有有限个值,有些则有无限多个。一个给定的ASN.1类型的值是该类型集合里的一个元素。ASN.1有四种类型:简单类型,它相当于原子,没有下层;结构类型,有组成部分;标签类型,由其它类型生成;其它类型,包括CHOICE和ANY类型。可以使用ASN.1的分配符(::=)给类型和值指定名字,这些名字可以用于定义其它类型或值。&&&&除了CHOICE和ANY类型以外,每种ASN.1类型都有一个标签,由一个类和一个非负的标签数组成。标签值可以唯一区分ASN.1类型。也就是说,ASN.1类型的名字并不影响它的抽象含义,只有标签值才有这个作用。有四类标签:&&&&●Universal:该类型的含义在所有的application中都相同。这种类型只在X.208中定义。&&&&●Application:该类型的含义由application决定,如X.500目录服务。两个不同的application中的类型可以具有相同的application-specific标签但是可以具有不同的含义。&&&&●Private:,该类型的含义根据给定的企业而不同。&&&&●Context-specific:该类型的含义根据给定的结构类型而不同。Context-specific标签用于在一个给定的结构类型上下文中区分使用相同的下层标签的组件类型。在两个不同的结构类型中组件类型可以具有相同的标签但是含义不同。&&&&具有universal标签的类型在X.208中定义,X.208也给出了类型的universal标签值。使用其他标签的类型在很多地方都有定义,通常是通过implicit或explicit标签获得。表一列出了部分ASN.1类型及其universal-class标签。(译者注:为了表示清晰,表格中的字段用下划线分隔开来)====Type&Tag================number_(decimal)========Tag_number_(hexadecimal)________INTEGER____________________2_________________________02________________________BIT_STRING_________________3_________________________03________________________OCTET_STRING_______________4_________________________04________________________NULL_______________________5_________________________05________________________OBJECT&IDENTIFIER__________6_________________________06________________________SEQUENCE&and&SEQUENCE&OF___16________________________10________________________SET&and&SET&OF____________17________________________11_________________________PrintableString____________19________________________13________________________T61String__________________20________________________14________________________IA5String__________________22________________________16________________________UTCTime____________________23________________________17________________&&&&&ASN.1类型和值使用一种灵活的、类似语言的符号表示,规则如下:&&&&分层(换行)无特殊意义;多个空格和多个空行相当于一个空格。&&&&注释由一对连字符(--)开头,或者一对连字符和一个空行&&&&识别符(值或字段的名字)和类型索引(类型的名字)由大小写字母、数字、连字符和空格组成;识别符由小写字母开头,类型索引由大写字母开头。&&&&下面的四个子节概括介绍了简单类型、结构类型、隐式和显式标签类型,及其他类型。第5节定义了类型的更多细节。2.1&简单类型(Simple&types)&&&&简单类型没有组件,是“原子级”的类型。ASN.1定义了几个简单类型,其中与PKCS标准有关类型如下:&&&&●BIT&STRING:由0和1任意组成的比特流&&&&●IA5String:由IA5(ASCII)字符任意组成的字符流&&&&●INTEGER:一个任意的整数&&&&●NULL:null值&&&&●OBJECT&IDENTIFIER:对象识别符,有一列整数构成,用于确定对象,如算法或属性类型&&&&●OCTET&STRING:任意的octet(8bit值)流&&&&●PrintableString:任意可打印字符流&&&&●T61String:T.61(8bit)字符的任意流&&&&●UTCTime:"coordinated&universal&time"或者格林威治平均时(GMT)值。&&&&简单类型分为两类:string类型和non-string类型。BIT&STRING,&IA5String,&OCTET&STRING,&PrintableString,&T61String,&和UTCTime是string类型。&&&&考虑到编码,String类型可以视为由组件组成,组件是substring。这样即使事先不知道值的长度也可以使用结构化的、不定长的编码方式进行编码(例如,从一个file&stream中输入的octet&string值)。&&&&String类型可以指定大小限制,以限制值的长度。&&&&2.2&结构化类型(Structured&types)&&&&结构类型由组件组成。ASN.1定义了四种,都与PKCS标准有关:&&&&●SEQUENCE:一个或多个类型的有序集合&&&&●SEQUENCE&OF:0个或某个给定类型多次出现的有序集合&&&&●SET:一个或多个类型的无序集合&&&&●SET&OF:0个或某给定类型多次出现的无序集合&&&&结构类型允许有可选组件。可选组件可能有默认值。&&&&2.3&隐式和显式标签类型(Implicitly&and&explicitly&tagged&types)&&&&在一个application中tagging对于区分类型十分有用,tagging通常也用于在一个结构类型中区分组件类型。例如,SET或SEQUENCE类型的可选组件一般都给予不同的context-specific标签以避免混淆。&&&&有两种方法可以标记一个类型:隐式(implicitly)和显式(explicitly)。隐式标签类型是在其它类型基础上通过改变其下层类型的标签生成的。隐式标签使用ASN.1关键词[class&number]&IMPLICIT(见第5.1节)表示。&&&&显式标签是在其它类型基础上通过在其下层类型的标签之外添加一个外层标签生成的。从效果上看,显式标签类型是包含一个组件的结构类型,该组件即下层类型。显式标签由ASN.1关键词[class&number]&EXPLICIT(见第5.2节)表示。&&&&只有关键词[class&number]与使用显式标签相同,除非该“模块”的ASN.1类型默认定义为隐式标签。(“模块”属于高级特性,不在本文档描述范围内)&&&&从编码的角度看,隐式标签类型可视为与下层类型相同,除非标签不同。显式标签类型可视为有一个组件的结构类型,该组件即为下层类型。隐式标签可以使编码较短,但是如果下层类型是不确定的,显式标签必须避免含糊不清(例如下层类型是CHOICE或ANY)。&&&&ASN.1中的其他类型包括CHOICE和ANY类型。CHOICE类型表示一个联合体,它具有一个或多个备选项(alternative);ANY类型表示任意类型的任意值,其中任意类型可能在使用对象识别符或整数值注册中定义。(未完待续)&ASN.1(Abstract Syntax Notation dotone)抽象语法标记定义抽象数据类型形式的标准,是用于描述数据表示、传输和编码的记法。
ASN.1只包含信息结构,不处理具体业务数据,它不是一个编程语言。
ASN.1没有限定编码方法,各种ASN.1编码规则提供了由ASN.1描述其抽象句法的数据的值的传送语法(具体表达)。
常见的编码规则有:基本编码规则(BER)、规范编码规则(CER,CanonicalEncoding Rules)、唯一编码规则(DER,DistinguishedEncoding Rules)、压缩编码规则(PER,PackedEncoding Rules)和XML编码规则(XER,XMLEncoding Rules)。这些编码规则描述了如何将定义在ASN.1中的值译成适合传输的电码。
ASN.1在OSI的ISO8824/ITU X.208(说明语法)和ISO8825/ITU X.209(说明基本编码规则)规范。
几个概念:
(1)实际语法
指诸如C、ObjectiveCaml等这样实际编程语言;
(2)抽象语法(AbstractSyntax)
指协议采用ASN.1规范描述的描述文本。描绘了与任何表示数据的编码技术无关的通用数据结构。抽象语法使得人们能够定义数据类型,并指明这些类型的值。抽象语法只描述数据的结构形式,与具体的编码格式无关,同时也不涉及这些数据结构在计算机内如何存放。
(3)传输语法(TransferSyntax)
指表示层交换数据的表示方法,是实际通讯系统间的码流。当数据在两个表示层实体之间传输时,这些数据的实际比特模式表示方法就是传送语法。
指将抽象语言法转换成实际通讯系统间比特流;
(5)编码规则
将抽象语言法转换成实际通讯系统间比特流所遵循的语法规则;
二.相关背景知识
1.为了顺利完成应用者的通讯,需使用以下概念:
(1)抽象语法:定义了数据的常用结构(包括不同的数据类型),并且建立了和应用层对话所用的构架。
(2)实际语法:本地的,并且定义本地系统的数据表示方法。
(3)传输语法:定义两个系统间的表示层间交换数据的表示方法。
(4)编码规则:提供从本地实际语法到传输语法和其相反操作的方法。(从抽象语法到传输语法,由ASN.1编译器按照编解码规则实现)
2.应用层Application Layer
应用层向表示层发送数据时,同时告知表示层自己的ASN.1名字(即对象标识符),ASN.1名字标记了一个ASN.1语法——用以解释数据中各字段的含义。通过参考ASN.1定义,表示可以得知数据单元的类型和长度,以及传输时应当采用的编码方法。
3.表示层Presentation Layer
两个系统在传输数据前需要协商共用的编码方式,事实上编码方式在应用层发出的数据中已经确定,应用数据中包含抽象语法/传输语法的组合关系,告诉表示层数据的结构、含义以及传输语法规则。表示层参考抽象语法,将应用数据转换为传输语法定义的比特流。
4.边界对齐
同样一条消息,在计算机内存中是以Byte为单位存储的,在链路上则是以bit为单位传送的。
如果一个信元的第一个bit也恰好是Byte流中某Byte的开始bit时,我们称之为开始于边界对齐的;
如果信元的最后一个bit也恰好是Byte流中某Byte的最后一个bit时,则可以称之为结束于边界对齐的。
对于不是结束于边界对齐的情况,一般要进行补位。有两种方式:
(1)对每个信元的结束立即进行补位,保证下一个信元是开始于边界对齐的;
( 2)从信元结束的位置开始新的信元,到消息结束时再进行一次补位操作。(用于无线空口中)
5.大小端(BigEndian vs Little Endian)
(1).大端方式,也叫网络序,从左往右,第一个8位表示高位,例如0X0102,用比特流表示是0010。
(2).小端方式,也叫主机序,与大端方式相反,数字0X0102用比特流表示则是0001,低8位在前,高8位在后。
Motorola的PPC系列、IP协议中使用大端方式;VAX计算机、Intel的x86系列中使用小端方式。
三.ASN.1的基本语法规则
1.ASN.1使用巴科斯范式(BNF):
在双引号中的字(&word&)代表着这些字符本身。而double_quote用来代表双引号。
在双引号外的字(有可能有下划线)代表着语法部分。
尖括号(& & )内包含的为必选项。
方括号([ ] )内包含的为可选项。
大括号({ } )内包含的为可重复0至无数次的项。
竖线(| )表示在其左右两边任选一项,相当于&OR&的意思。
::=是“被定义为”的意思。
这是用BNF来定义的Java语言中的For语句的实例:
   FOR_STATEMENT::=
   &for&&(& ( variable_declaration |
   (expression &;& ) | &;& )
   [expression ] &;&
   [expression ]
   &)&statement
2.在ASN.1中,符号的定义没有先后次序:只要能够找到该符号的定义即可。
3.所有的标识符、参考、关键字都要以一个字母开头,后接字母(大、小写都可以)、数字或者连字符“-”(但不能以连字符“-”结尾,也不能连续出现两个连字符),不能出现下划线“_”。
4.关键字一般都是全部大写。
5.在标识符中,只有类型和模块名字是以大写字母开头的,其它标识符都是以小写字母开头。
6.ASN.1中实数实际定义为三个整数:尾数、基数和指数。没有小数表示方式。
7.ASN.1不对空格、制表符、换行符和注释做翻译。但是在定义符号(或者分配符号Assignment)“::=”中不能有分隔符。
四.ASN.1中的类型
类型是一个非空的值的集合,可以被编码后传输。相比与高级语言中复杂的数据结构,ASN.1中的类型主要是为了数据的传输。
1.ASN.1中的类型分为基本类型(内建数据类型)和组合类型,组合类型由一个或多个基本类型构成。
只包含一个值NULL,用于传送一个报告或者作为CHOICE类型中某些值
全部整数(包括正数和负数)
实数,表示浮点数
ENUMERATED
标识符的枚举(实例状态机的状态)
OCTETSTRING
OBJECT IDENTIFIER,
RELATIVE-OID
一个实体的标识符,它在一个全世界范围树状结构中注册
EXTERNAL,EMBEDDED PDV
表示层上下文交换类型
…String(除了BITSTRING、OCTETSTRING外)
各种字符串,有NumericString、PrintableString、VisibleStirng、ISO64String、IA5String、TeletexStirng、T61String、VideotexString、GraphicString、GeneralString、UniversalString、BMPString和UTF8String
CHARACTERSTRING
允许为字符串协商一个明确的字符表
UTCTime,GeneralizedTime
在类型中选择(相当于C中的联合)
由不同类型的值组成一个有序的结构(相当于C中的结构体)
由不同类型的值组成一个无序的结构
SEQUENCEOF
由相同类型的值组成一个有序的结构(相当于C中的数组)
由相同类型的值组成一个无序的结构
2.类型定义
&新类型的名字&::= &类型描述&
Married ::= BOOLEAN
Age ::= INTEGER
Picture ::= BIT STRING
Form ::= SEQUENCE
name PrintableString,
married Married,
marriage-certificate PictureOPTIONAL
Married类型是一个基本类型BOOLEAN,Form类型是一组基本类型的有序序列
注意:在SEQUENCE和SET等(好像应该是所有组合类型的)定义中,最后一个成员结尾没有逗号“,”。
为了接收方能正确解码,发送方为每个值的类型附加一个数,称为tag,在描述中以“[]”标识。缺省情况下,编码器会使用universal的tag。在给合类型中,为了明确各个成员,有必要指明每个成员的Tag:
Coordinates ::= SET
x [1] INTEGER,&//这证明好像也可以用类来直接声明变量
y [2]INTEGER,
z [3]INTEGER OPTIONAL
Tag会在传输规则使用到,用于在比特流中指明数据的具体类型。
为了准确描述一个类型,我们需要对值的集合进行一定的限制。这用到子类型约束,在类型之后用圆括号进行标识。
Lottery-number::= INTERGER(1..49)表示取1-49任一一个值
Lottery-draw ::=SEQUENCESIZE(6)&OF Lottery-number指定了该SEQUENCE类型由6个Lottery-number类型有序组成。
Upper-case-words::= IA5String&(FROM(“A”..”Z”))表示按ASCII取A-Z中任一一个,IA5String是ASCII字符串类型
为了方便在新的版本中往现有类型中添加新成员,可用“…”来标记可能以后是其它类型的地方:
Type ::= SEQUENCE
component1 INTERGER,
component2 BOOLEAN,
以后新的版本中,描述可能为:
Type ::= SEQUENCE
component1 INTERGER,
component2 BOOLEAN,
[[component3REAL]], -- version 2
注意:新加入的类型成员要嵌套在“[[]]”中,--version
2指定新版本号
3.值定义
&新的值的名字&&该值的类型& ::=&值描述&
&新的值的名字&是以小写字母开头的标识符;
&该值的类型&可以是一个类型的名字,也可以是类型描述;
&值描述&是基于整数、字符串、标识符的组合。
counter Lottery-number ::= 45
sextuple Lottery-draw ::= { 7, 12, 23, 31, 33, 41 }
4.信息对象类和信息对象
&信息对象类&::= CLASS &类描述&
WITHSYNTAX &信息描述&
用于表达比注释更为正式的一些信息
5.模块定义
&模块名字& DEFINITIONS &缺省Tag&::=
EXPORTS &导出描述&
IMPORTS &导入描述&
&模块体描述&
一般协议由一个或者多个模块组成,模块用来收集数据结构定义。
模块名字必须以大写字母开头。模块能以一种“全局指针”(UniversalPointer)的方式来引用,称为对象标识符(ObjectIdentifier),用花括号标识在名字之后。
Module2 { isomember-body(2) f(250) type-org(1) ft(16)
asn1-book(9)chapter5(0) module2(1) }
DEFINITIONS AUTOMATICTAGS ::=
EXPORTS Type2;
IMPORTS Type1, valueFROM Module1 {iso member-body(2)
f(250) type-org(1)ft(16) asn1-book(9) chapter5(0) module1(0)};
Type2 ::= SEQUENCE OFChoice
Choice ::= CHOICE
a INTEGER (0..value),
(1).AUTOMATICTAGS是指缺省Tag,说明不关注模块的Tag。
(2).IMPORTS声明在其它模块定义但在本模块会用到的类型或者值。
EXPORT声明在本模块之外可以访问的类型或者值。
IMPORTS的语法为:
IMPORTS &名字&,value FROM &其它模块的ObjectIdentifier &;
EXPORTS的语法为:
EXPORTS&名字&;
(3).对象标识符(OBJECTIDENTIFIER,OID)类型用层次的形式来表示标准规范。标识符树通过一个点分的十进制符号来定义,这个符号以组织,子部分然后是标准的类型和各自的子标识符开始.
例如:MD5的OID是1.2.840..5表示为&iso(1)member-body
(2) US (840) rsadsi(113549) digestAlgorithm (2) md5 (5)&,所以当解码程序看到这个OID时,就知道是MD5散列。
OID在公钥算法标准中很流行,它指出证书绑定了哪种散列算法。
OID在传输时编码规则:
前两部分如果定义为x.y,那么它们将合成一个字40*x+ y,其余部分单独作为一个字节进行编码。
每个字首先被分割为最少数量的没有头零数字的7位数字.这些数字以big-endian格式进行组织,并且一个接一个地组合成字节.除了编码的最后一个字节外,其他所有字节的最高位(位8)都为1。
MD5OID的编码:
&1&.将1.2.840..5转换成字数组{42,840, , 5}。
&2&.然后将每个字分割为带有最高位的7位数字,{{0x},{0x86,0x48},{0x86,0xF7,0x0D},{0x02},{0x05}}。
&3&.最后完整的编码为0x 7 0D 02 05。 
6.模块和分配(Assignment)
(1).定义一个新类型
TypeReference ::=CHOICE
integer INTEGER,
boolean BOOLEAN
(2).给类型赋值
在ASN.1中给类型赋的值不会被编码(ASN.1语法只是一种语法规则用来描述业务数据,而不会被当成业务数据),这种值常用作DEFAULT,上下界或者信息对象中。
value-referenceTypeReference ::= integer:12
如果两个类型在语法上是完全一样的,则这两种类型的值可以相互赋值。如:
Pair::= SEQUENCE
x INTEGER,
Couple::= SEQUENCE
x INTEGER,
pairPair ::= {x 5, y 13}
coupleCouple ::= pair
(3).值集合
在语义上,一个值集合相当于一个添加约束后的类型。如:
PrimeNumbers INTEGER ::= {2 | 3 | 5 | 7 | 11 | 13}
本文已收录于以下专栏:
相关文章推荐
{margin-bottom:0.21cm}
{margin-bottom:0.21cm}
h2.western
{font-family:&DejaVu San...
2  基础知识
本章的内容主要翻译自《ASN.1 Communication between Heterogeneous Systems》。
基本类型...
1.ASN.1概述
    抽象语法表示(标记)ASN.1(Abstract Syntax Notation One )一种数据定义语言,描述了对数据进行表示、编码、传输和解码的数据格式。网络管理系...
2  基础知识
本章的内容主要翻译自《ASN.1 Communication between Heterogeneous Systems》。
2.11 
一.基本规则
BER(BasicEncoding Rules)是ASN.1中最早定义的编码规则,其他编码规则是在BER的基础上添加新的规则构成。
1.BER传输语法的格式一直...
一.基本规则
BER(BasicEncoding Rules)是ASN.1中最早定义的编码规则,其他编码规则是在BER的基础上添加新的规则构成。
1.BER传输语法的格式一直...
ASN.1笔记——2
一.ASN.1基本类型
基本类型汇总表
UNIVERSALTag
BOOLEAN
...
传输数据时,接收方要明确知道每个收到的数据的类型,我们就要对各类型进行系统性的编号。在ASN.1中使用Tag来唯一标识数据的类型。
(1).分配给每个类型的tag实际上是...
3.2  CER与DER
CER与DER(Canonical and Distinguished Encoding Rules)
3.2.1  更多限制规则的需求
在X.400 和X...
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 asn.1基础数据类型 的文章

 

随机推荐