一、介绍 Abstract Syntax Notation One (ASN.1)是一种独立于机器的描述语言,用于描述在网络上传递的消息 标准包括: ISO 8824-1 | ITU-T X.680: Specification of basic notation, ISO 8824-2 | ITU-T X.681: Information object specification, ISO 8824-3 | ITU-T X.682: Constraint specification, ISO 8824-4 | ITU-T X.683: Parameterization of ASN.1 ASN.1特别适合表示现代通信应用中那些复杂的、变化的及可扩展的数据结构 ASN.1 可分为两个部分 语法规则:从数据类型、内容顺序或结构等方面来描述消息的内容 编码规则:如何编码实际消息中的数据 特点: 表达简单和复杂类型的能力 可对类型根据大小及(或)数值进行约束 也可以施加更强的约束 字段可标记为 OPTIONAL 大写开头表示类型名,小写开头的表示变量名/字段名 二、ASN.1术语 1.抽象语法(Abstract Syntax) 描述通用数据结构 允许定义数据类型和值 2.数据类型(Data Type) 值的集合,可以是简单类型或结构类型 可以对数据类型命名 3.编码(Encoding) 用于表示数据值的字节序列 4.编码规则(Encoding Rules) 给出从一种语法到另一种的映射方法 5.传输语法(Transfer Syntax) 位模式(Bits pattern) 描述数据是在传输时是如何表示的 三、ASN.1模块定义 模块(module):ASN.1规范中的基本构造块 模块定义格式如下:
<modulereference> DEFINITIONS ::= BEGIN EXPORTS IMPORTS AssignmentList END 其中:EXPORTS 这个模块中的定义可能被其他模块引入 IMPORTS 定义由其他模块引入 AssignmentList 这个模块中将定义类型分配、值分配及宏定义
四、ASN.1简单类型 1. 基本类型:BOOLEAN,INTEGER,ENUMERATED,REAL,BIT STRING,OCTET STRING 2. 字符串类型(ISO10646-1的子集) NumericString (0-9,<space>) PrintableString (0-9,A-Z,a-z,<space>,<s[ecial> VisibleString GraphicString UTF8String IA5String (ASCII) 3. 对象类型 OBJECT IDENTIFIER ObjectDescriptor 对象标识符:一个任意长的非负整数序列,用于标记对象(如算法等) 4. 其它类型 NULL 空值 UTCTime yymmdd hhmm[ss] <local offset from UTC> GeneralizedTime yyyymmdd hhmm[ss] <local offset from UTC> 强制从2050年开始
五、ASN.1类型定义 语法: <type name> ::= <type> 示例: Counter ::= INTEGER IpAddress ::= OCTET STRING Months ::= ENUMERATED { january (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子类型定义 语法: <subtype name> ::= <type> (<constraint>) 示例: Counter ::= INTEGER (0..65536) IpAddress ::= OCTET STRING ( SIZE(4) ) Spring ::= Months (march | april | may) Summer ::= Months (june | july | august ) SmallPrime ::= INTEGER ( 2 | 3 | 5 | 7 | 11 ) ExportKey ::= BIT STRING ( SIZE(40) )
七、ASN.1赋值 语法: <value name> <type> ::= <value> 示例: ipInReceives Counter ::= 2450 ipRouteMask IpAddress ::= ‘FFFFFF00’H currentMonth Months ::= july currentTime UTCTime ::= “030708094018+0800” name VisibleString ::= “John” married BOOLEAN ::= TRUE faxMessage BIT STRING ::= ‘01100001101’B
internet OBJECT IDENTIFIER ::= { iso(1) org(3) dod(6) 1 } private OBJECT IDENTIFIER ::= { internet 4 }
八、ASN.1结构类型 SEQUENCE 对应于C语言中的struct 类型定义 UserAccount ::= SEQUENCE { username PrintableString, password PrintableString, accountNr INTEGER } 赋值 myAccount UserAccount ::= { username “tly”, password “guesswhat”, accountNr 2345 } SEQUENCE OF 对应于C语言中的数组 类型定义 MemberCountries ::= SEQUENCE OF PrintableString AccountRegistry ::= SEQUENCE OF UserAccount 赋值 eastAsia MemberCountries ::= { “China”, “Japan”, “Korean”, “DPR” } SET 类似于SEQUENCE,但不考虑分量顺序 类型定义 UserAccount ::= SET { username [0] PrintableString, password [1] PrintableString, accountNr [2] INTEGER } 赋值 myAccount UserAccount ::= { accountNr 2345, username “tly”, password “guesswhat” } SET OF 集合类型,每一分量类型相同,不考虑顺序 类型定义 Keywords ::= SET OF PrintableString 赋值 someASN1Keywords Keywords ::= { “INTEGER”, “BOOLEAN”, “REAL” }
|