目录
2020课程设计 Week1 Asn.1格式的学习
一、简介
-
ASN.1(Abstract Syntax Notation dotone),抽象语法标记1。是定义抽象数据类型形式的标准,是用于描述数据表示、表示、传输、编码的记法。
-
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(说明基本编码规则)规范。
-
几个概念:
- 实际语法:指诸如C、ObjectiveCaml等这样实际编程语言;
- 抽象语法(AbstractSyntax):指ASN.1,是协议采用ASN.1规范描述的描述文本。描绘了与任何表示数据的编码技术无关的通用数据结构。抽象语法使得人们能够定义数据类型,并指明这些类型的值。抽象语法只描述数据的结构形式,与具体的编码格式无关,同时也不涉及这些数据结构在计算机内如何存放。
- 传输语法(TransferSyntax):指表示层交换数据的表示方法,是实际通讯系统间的码流。当数据在两个表示层实体之间传输时,这些数据的实际比特模式表示方法就是传送语法。
- 编码:指将抽象语言法转换成实际通讯系统间比特流;
- 编码规则:将抽象语言法转换成实际通讯系统间比特流所遵循的语法规则;
二、ASN.1的基本语法规则
- ASN.1使用巴科斯范式(BNF):
- 在双引号中的字("word")代表着这些字符本身。而double_quote用来代表双引号。
- 在双引号外的字(有可能有下划线)代表着语法部分。
- 尖括号(< > )内包含的为必选项。
- 方括号([ ] )内包含的为可选项。
- 大括号({ } )内包含的为可重复0至无数次的项。
- 竖线(| )表示在其左右两边任选一项,相当于"OR"的意思。
- ::=是“被定义为”的意思。
- 在ASN.1中,符号的定义没有先后次序:只要能够找到该符号的定义即可。
- 所有的标识符、参考、关键字都要以一个字母开头,后接字母(大、小写都可以)、数字或者连字符“-”(但不能以连字符“-”结尾,也不能连续出现两个连字符),不能出现下划线“_”。注释以--开头,以--或行尾结束。
- 关键字一般都是全部大写。
- 在标识符中,只有类型和模块名字是以大写字母开头的,其它标识符都是以小写字母开头。
- ASN.1中实数实际定义为三个整数:尾数、基数和指数。没有小数表示方式。
- ASN.1不对空格、制表符、换行符和注释做翻译。但是在定义符号(或者分配符号Assignment)“::=”中不能有分隔符。
三、ASN.1中的类型
类型是一个非空的值的集合,可以被编码后传输。相比与高级语言中复杂的数据结构,ASN.1中的类型主要是为了数据的传输。
ASN.1中的类型分为基本类型(内建数据类型)和组合类型,组合类型由一个或多个基本类型构成。
1.基本类型
类型 | 含义 |
---|---|
BIT STRING | 比特串 |
BOOLEAN | 布尔型 |
INTEGER | 整数 |
NULL | 空值 |
OBJECT IDENTIFIER | 对象标识符 |
OCTET STRING | 字节串 |
PrintableString | 可打印字符串 |
UTCTime | “协调世界时” |
GeneralizedTime | 通用时间 |
2.构造类型
- 复杂事物可以视为简单的事物集合或序列。
- 集合是顺序无关的,而序列是顺序有关的。
- 构造类型被用来描述复杂的事物,包括若干字段(简单类型或其他构造类型)。
- ASN.1定义了四种构造方式,描述有序和无序的各种情况。
2.1SEQUENCE
-
表示1个或多个字段组成的有序序列,例如:
ReportEntry ::= SEQUENCE { author OCTET STRING, title OCTET STRING, body OCTET STRING, biblioBook Bibliography }
- 用户定义的类型名和标识符大小写规定
类型名 首字母为大写的驼峰式,如“ReportEntry”
标识符 首字母为小写的驼峰式,如“biblioBook”
2.2SEQUENCE OF
-
表示0个或多个特定类型字段的有序序列,例如:
Report ::= SEQUENCE SIZE (100) OF ReportEntry Report ::= SEQUENCE SIZE (MAX) OF ReportEntry
2.3SET
-
表示1个或多个字段组成的无序集合,例如:
Menu ::=SET{ sandwich Food, coke Beverage }
2.4SET OF
-
表示0个或多个特定类型字段的无序集合,例如:
Class ::= SET SIZE (50) OF Student
2.5使用ASN.1编写一个数据结构
-
基于各种构造方式,将基本数据类型经过层次嵌套,最终构造出能描述任何抽象事物的数据结构。
-
例如:
Bibliography ::= SEQUENCE { author OCTET STRING title OCTET STRING publisher OCTET STRING year OCTET STRING }
3.其他关键字
- CHOICE:从若干类型中选择其一即可
- ANY:构造类型中的某字段依赖于 其他字段的值 (ANY DIFINED BY)
- OPTIONAL:构造类型中某字段可选
- DEFAULT:指定构造类型中某字段的缺省值