当前位置: 代码迷 >> 综合 >> ASN.1笔记——语法规则与类型概述
  详细解决方案

ASN.1笔记——语法规则与类型概述

热度:19   发布时间:2024-01-21 01:01:32.0

学习资料: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(说明基本编码规则)规范。

几个概念:

(1)实际语法

指诸如C、ObjectiveCaml等这样实际编程语言;

(2)抽象语法(AbstractSyntax)

指ASN.1,是协议采用ASN.1规范描述的描述文本。描绘了与任何表示数据的编码技术无关的通用数据结构。抽象语法使得人们能够定义数据类型,并指明这些类型的值。抽象语法只描述数据的结构形式,与具体的编码格式无关,同时也不涉及这些数据结构在计算机内如何存放。

(3)传输语法(TransferSyntax)

指表示层交换数据的表示方法,是实际通讯系统间的码流。当数据在两个表示层实体之间传输时,这些数据的实际比特模式表示方法就是传送语法。

(4)编码

指将抽象语言法转换成实际通讯系统间比特流;

(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,用比特流表示是0000000100000010。

(2).小端方式,也叫主机序,与大端方式相反,数字0X0102用比特流表示则是0000001000000001,低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

只包含一个值NULL,用于传送一个报告或者作为CHOICE类型中某些值

INTEGER

全部整数(包括正数和负数)

REAL

实数,表示浮点数

ENUMERATED

标识符的枚举(实例状态机的状态)

BITSTRING

比特串

  相关解决方案