一、ASN.1 (Abstract Syntax Notation One)

ASN.1包括两部分:数据描述语言(ISO 8824)和数据编码规则(ISO 8825)。ASN.1的数据描述语言允许用户自定义基本的数据类型,并可以通过简

单的数据类型组成更复杂的数据类型。ASN.1 取得成功的一个主要原因是它与几个标准化编码规则相关,如基本编码规则(BER)、规范编码规

则(CER)、可识别编码规则(DER)、压缩编码规则(PER)和 XML编码规则(XER)。

ASN.1中定义的数据类型既有简单的基本数据类型,也有复杂的结构类型。

  1. 基本类型是不可再再分的,包括:

    • 布尔型(BOOLEAN)
    • 整型(INTEGER)
    • 实型(REAL)
    • 位串类型(BITSTRING)
    • 8位位组类型(OCTET STRING)
    • 枚举类型(ENUMERATED)
    • 空类型(NULL)
    • 对象标识符(OBJECT IDENTIFIER)
  2. 除基本类型,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)
T L V T L V

数据域(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值
  • 数据长度域拥有短形式和长形式两种
    1. 短形式的数据长度域只有一个字节,第8位为0,其他低7位给出数据长度。
    2. 长形式的数据长度域有 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/BER/DER 编码子集入门指南

抽象语法符号ASN.1(Abstract Syntax Notation One)的更多相关文章

  1. 抽象语法树 Abstract syntax tree

    什么是抽象语法树? 在计算机科学中,抽象语法和抽象语法树其实是源代码的抽象语法结构的树状表现形式 在线编辑器 我们常用的浏览器就是通过将js代码转化为抽象语法树来进行下一步的分析等其他操作.所以将js ...

  2. 抽象语法树简介(ZZ)

    转载自: http://www.cnblogs.com/cxihu/p/5836744.html (一)简介 抽象语法树(abstract syntax code,AST)是源代码的抽象语法结构的树状 ...

  3. AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解

    AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解 javascriptvue-clicommonjswebpackast  阅读约 27 分钟 抽象语法树(AST),是一 ...

  4. vue 的模板编译—ast(抽象语法树) 详解与实现

    首先AST是什么? 在计算机科学中,抽象语法树(abstract syntax tree或者缩写为AST),或者语法树(syntax tree),是源代码的抽象语法结构的树状表现形式,这里特指编程语言 ...

  5. SQL抽象语法树及改写场景应用

    1 背景 我们平时会写各种各样或简单或复杂的sql语句,提交后就会得到我们想要的结果集.比如sql语句,"select * from t_user where user_id > 10 ...

  6. java抽象语法

    1.基本概念: 0.0.抽象类的定义:抽象类是为子类提供一个规范,其目地是由子类去继承实现(类似国家提出的法律,由我们去执行). 0.1.定义抽象类用abstract来定义. 语法: public a ...

  7. 1 Java程序文件中函数起始行和终止行在程序文件位置中的判定__抽象语法树方法

    应用需求: 实现对BigCloneBench中函数体的克隆检测,必须标注出起始行号和终止行号. 问题: 给定一个Java文件,从中提取出每个函数的起始行和终止行. 难点: 这个问题的难点在于,对于Ja ...

  8. 抽象工厂方法模式(Abstract Factory Pattern)

    Provide an interface for creating families of related or dependent objects without specifying their ...

  9. Java实现 LeetCode 779 第K个语法符号(递归)

    779. 第K个语法符号 在第一行我们写上一个 0.接下来的每一行,将前一行中的0替换为01,1替换为10. 给定行数 N 和序数 K,返回第 N 行中第 K个字符.(K从1开始) 例子: 输入: N ...

随机推荐

  1. Failed to resolve

    一: 把//classpath 'com.android.tools.build:gradle:2.2.2'改成classpath 'com.android.tools.build:gradle:3. ...

  2. 嵌入式之UBOOT

    嵌入式Linux系统的结构分为四个区,如图所示: 1.Bootloader区存放的是Bootloader,Coidre972开发板上使用的uboot,它负责嵌入式系统最初的硬件初始化.驱动和内核加载. ...

  3. /etc/fstab文件损坏的补救措施

    最近乱搞,把/etc/fstab弄坏了,导致无法进入图形界面,而且所有文件都是只读的(简直郁闷到底啊),查了好多资料什么的终于弄好了,也走了不少弯路 恩,我不喜欢扯太多东西,这个是补救的帖子,还是希望 ...

  4. nginx介绍和安装

    1.nginx的介绍 1.1 nginx的优势 1) 作为Web服务器,Nginx处理静态文件.索引文件,自动索引的效率非常高. 2) 作为代理服务器,Nginx可以实现无缓存的反向代理加速,提高网站 ...

  5. Python学习(26):Python函数式编程

    转自  http://www.cnblogs.com/BeginMan/p/3509985.html 前言 <core python programming 2>说: Python不大可能 ...

  6. Qt+imx6编写的楼宇对讲管理平台

    第一个初步版本. 1:楼宇对讲模块.住户报警模块.门禁控制模块.系统设置模块. 2:实时对讲信息卡片式展示,通话记录表格展示. 3:设备面板展示,实时显示上下线报警等信息. 4:设备查询.记录查询.运 ...

  7. css笔记 - 张鑫旭css课程笔记之 overflow 篇

    overflow基本属性值 visible(默认值):超出依然显示 hidden :超出隐藏 scroll :超出,滚动显示.子元素不超出也会有滚动条的那条轨道. auto:如果超出,滚动显示.如果不 ...

  8. 一个简单web系统的接口性能分析及调优过程

    在测试一个简单系统接口性能压力时,压到一定数量,程序总是崩溃,查看相关机器相关数据时,CPU.内存.IO占用均不高,问题自然出现在其它地方先介绍下系统部件架构 Resin版本为:[root@local ...

  9. spring boot 通过Maven + tomcat 自动化部署

    使用maven创建的springboot项目,默认是jar包,springboot还有自己带的tomcat. 现在为了简单实现本地自动发布项目到服务器,需要通过发布war包的形式,通过maven将项目 ...

  10. Git - could not read Username for 'https://github.com',push报错解决办法

    执行git push命令异常,如下: git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sou ...