抽象语法符号ASN.1(Abstract Syntax Notation One)
一、ASN.1 (Abstract Syntax Notation One)
ASN.1包括两部分:数据描述语言(ISO 8824)和数据编码规则(ISO 8825)。ASN.1的数据描述语言允许用户自定义基本的数据类型,并可以通过简
单的数据类型组成更复杂的数据类型。ASN.1 取得成功的一个主要原因是它与几个标准化编码规则相关,如基本编码规则(BER)、规范编码规
则(CER)、可识别编码规则(DER)、压缩编码规则(PER)和 XML编码规则(XER)。
ASN.1中定义的数据类型既有简单的基本数据类型,也有复杂的结构类型。
- 基本类型是不可再再分的,包括:
- 布尔型(BOOLEAN)
- 整型(INTEGER)
- 实型(REAL)
- 位串类型(BITSTRING)
- 8位位组类型(OCTET STRING)
- 枚举类型(ENUMERATED)
- 空类型(NULL)
- 对象标识符(OBJECT IDENTIFIER)
- 除基本类型,ASN.1还定义了多种复杂的结构类型,例如:
- SEQUENCE:有序的数据集合(序列),由不同类型的数据组成。SEQUENCE结构强调内部成员的排序
- SEQUENCE OF:有序的数据集合,类似于C语言的数组,由同一类型的数据组成。
- SET:由不同类型的数据组成的集合,用来描述复杂的信息对象,对内部成员的顺序不作要求,类似于C语言的结构体类型
- CHOICE:选择结构,在列出的内部成员中,只能选择其中之一,类似于C语言中的共用体类型
二、基本编码规则BER(Basic Encoding Rules)
BER把复杂的用抽象语法描述的数据结构表示成简单的数据流,从而便于在通信线路上传送。BER以8bit为一个基本传送单位。对于每个所传送的
值,无论是基本类型还是构造类型,都由TLV三个字段组成,TLV分别指类型标识符域(Tag),数据长度域(Length)和数据域(Value)字段。
其中,数据域可以多重嵌套其他数据元素的TLV字段,BER编码的具体格式如下所示
| 类型标识符域(T) | 数据长度域(L) |
数据域(V) |
- Tag占用一个字节,8和7位表示Tag类型,第6位是0表示编码类型是基本类型,第5 ~ 1位是Tag值,各个位表示的意义如下:
bit 取值 表示含义 8 ~ 7 0 0 Universal (简单类型) 0 1 Application(应用类型) 1 0 context-specific(上下文类型) 1 1 private(专用类型) 6 0 原始类型 1 构造类型 5 ~ 1 Tag值 - 数据长度域拥有短形式和长形式两种
- 短形式的数据长度域只有一个字节,第8位为0,其他低7位给出数据长度。
- 长形式的数据长度域有 2 ~ 127个字节。第一个字节的的第8位为1,其他低7位给出后面该域使用的字节的数量,从该域的第二个字节开始给出数据的长度
- 数据域给出了具体的数据值。该域的编码对不同的数据类型不一样
三、压缩编码规则PER(Packet Encoding Rules)
BER带来了大量的冗余信息增加了通信量的开销。对应用而言,编码开销出现在编码格式TLV三个字段的每个部分。PER在BER的基础上,以减
少编码开销为目的而设计的编码规则。
使用PER的一个重要的前提是,用户数据是单个ASN.1类别,且接收方也有一个相同的ASN.1描述。基于此,PER可以抛弃BER按步就班的编码规则,
省略对数据结构的编码,PER编码仍然采用TLV格式,PER编码主要使用了三个减小编码长度的技术
- 省略类型标识符
省略类型标识符在编码中似乎是一个重在部分,但实际上通常是不必要的,由于网络通信双方都遵循统一的网络协议,因此它们不可以从数据结构中推导出特定元素的类型和标识,就可以在编码中省略类型标识符 - 长度段的编码更加精简
BER的长度段的编码都是字节,而且BER长度的编码不考虑具体条件,然而PER的长度字段根据编码的类型的不同,有不同的单位。这些单位可以是比特、字节、元素、字符等,这也是PER利用数据结构已知的优势来减少编码量的又一方式;而且根据具体的条件限制,PER的长度段还可以大幅度削减,譬如当数据类型的长度固定时,该数据项的长度可以不编码。 - 对数字类型的编码更加精简
在对Integer等数字类型进行编码时,BER采取的是直接对数值进行编码;而PER采取的是对数据的偏移值offset进行编码。所谓偏移值就是实际值减去下界的值。例如:Integer(123456789 ... 123456790),在PER编码中123456790的offset=1,因此PER只需对1进行编码,这样对于那些下界类型很大的整数,可以节省大量字节,且编码本身非常简洁。
抽象语法符号ASN.1(Abstract Syntax Notation One)的更多相关文章
- 抽象语法树 Abstract syntax tree
什么是抽象语法树? 在计算机科学中,抽象语法和抽象语法树其实是源代码的抽象语法结构的树状表现形式 在线编辑器 我们常用的浏览器就是通过将js代码转化为抽象语法树来进行下一步的分析等其他操作.所以将js ...
- 抽象语法树简介(ZZ)
转载自: http://www.cnblogs.com/cxihu/p/5836744.html (一)简介 抽象语法树(abstract syntax code,AST)是源代码的抽象语法结构的树状 ...
- AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解
AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解 javascriptvue-clicommonjswebpackast 阅读约 27 分钟 抽象语法树(AST),是一 ...
- vue 的模板编译—ast(抽象语法树) 详解与实现
首先AST是什么? 在计算机科学中,抽象语法树(abstract syntax tree或者缩写为AST),或者语法树(syntax tree),是源代码的抽象语法结构的树状表现形式,这里特指编程语言 ...
- SQL抽象语法树及改写场景应用
1 背景 我们平时会写各种各样或简单或复杂的sql语句,提交后就会得到我们想要的结果集.比如sql语句,"select * from t_user where user_id > 10 ...
- java抽象语法
1.基本概念: 0.0.抽象类的定义:抽象类是为子类提供一个规范,其目地是由子类去继承实现(类似国家提出的法律,由我们去执行). 0.1.定义抽象类用abstract来定义. 语法: public a ...
- 1 Java程序文件中函数起始行和终止行在程序文件位置中的判定__抽象语法树方法
应用需求: 实现对BigCloneBench中函数体的克隆检测,必须标注出起始行号和终止行号. 问题: 给定一个Java文件,从中提取出每个函数的起始行和终止行. 难点: 这个问题的难点在于,对于Ja ...
- 抽象工厂方法模式(Abstract Factory Pattern)
Provide an interface for creating families of related or dependent objects without specifying their ...
- Java实现 LeetCode 779 第K个语法符号(递归)
779. 第K个语法符号 在第一行我们写上一个 0.接下来的每一行,将前一行中的0替换为01,1替换为10. 给定行数 N 和序数 K,返回第 N 行中第 K个字符.(K从1开始) 例子: 输入: N ...
随机推荐
- Python学习笔记18-发送邮件
SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件. Python对SMTP支持有smtplib和email两个模块,email负责构造邮件, ...
- [Ubuntu] apt 添加第三方库
1. 方法一:直接在 /etc/apt/sources.list 添加第三方库. $ sudo vi /etc/apt/sources.list 在其中添加: deb http://archive.s ...
- 发送http请求
public static String httpGetSend(String url) { String responseMsg = ""; HttpClient httpCli ...
- Fragment获取Activity,Activity获取Fragment
在界面布局文件中使用<fragment>元素添加Fragment时,可以为<fragment>元素指定android:id或android:tag属性,这两个属性都可用于标识该 ...
- Malab 常用数学函数
l 三角函数和双曲函数 名称 含义 名称 含义 名称 含义 sin 正弦 csc 余割 atanh 反双曲正切 cos 余弦 asec 反正割 acoth 反双曲余切 tan 正切 ac ...
- EGit系列第一篇——创建本地仓库
首先,用Eclipse创建一个项目,然后右键项目Team\Share Preject... 然后出来Share Preject对话框,选择git 点击下一步配置Git仓库,通常在项目本地目录创建仓库, ...
- Android 框架
1. https://github.com/wyouflf/xUtils xUtils简介 xUtils 包含了很多实用的android工具. xUtils 最初源于Afinal框架,进行了大量重构, ...
- android studio下生成jni头文件
cd app/src/main javah -d jni -classpath ../../build/intermediates/classes/debug net.sourceforge.lame ...
- linux下find(文件查找)命令的用法总结
关联文章:http://blog.chinaunix.net/uid-24648486-id-2998767.html
- echarts中关于自定义legend图例文字
formatter有两种形式: - 模板 - 回调函数 模板 使用字符串模板,模板变量为图例名称 {name} formatter: 'Legend {name}' 回调函数 formatter: f ...