一、介绍
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”
}
转载:http://www.cppblog.com/chenrj/archive/2007/11/10/36291.aspx