一、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. Nginx 用户认证

    访问一些比较私密的页面 ( 如管理后台,数据后台 ) 时,我们就可以设置访问该页面时需要使用用户名和密码进行验证,这就是用户认证 [root@localhost ~]$ cat /usr/local/ ...

  2. 系统头文件cmath,cstdlib报错

    >C:\Program Files (x86)\Microsoft Visual Studio\\Community\VC\Tools\MSVC\\include\cstdlib(): erro ...

  3. es5.0 安装head插件

    es5.0的安装和之前的版本有些区别,我的电脑用plugin install 没成功, 查了一下资料,说是可以用grunt进行安装,启动; 1,先安装grunt: grunt是一个很方便的构建工具,可 ...

  4. SimpleDateFormat 取当前周的周一和周日的日期,当前月第一个和最后一天的日期

    /** * 类说明 :以及获取当前周的周一和周日的日期,当前月第一个和最后一天的日期 * 日期格式化:格式参数  G 年代标志符  y 年 M 月 d 日    h 时 在上午或下午 (1~12)  ...

  5. flask路由中增加正则表达式

    #coding=utf-8 from flask import Flask from werkzeug.routing import BaseConverter class RegexConverte ...

  6. N76E003系统时钟

    系统时钟源N76E003共有3种系统时钟源,包括: 内部高速/低速振荡器.外部输入时钟.它们每一个都可以作为N76E003的系统时钟源.开启不同的时钟源可能会影响到多功能引脚P3.0/XIN .内部振 ...

  7. tp3.2分页功能

    后台 1.利用Page类和limit方法分页 $User = M('User'); // 实例化User对象 $count = $User->where('status=1')->coun ...

  8. sencha touch 在线实战培训 第一期 第五节

    2014.1.6晚上8点准时开的课 本期培训一共八节,前三堂免费,后面的课程需要付费才可以观看. 本节内容:             实现皮肤自定义样式的修改 css相关理论: 重写官方样式,美化ap ...

  9. URI Scheme注册伪协议实现远程命令执行

    Windows配置注册表注册伪协议 1.新建伪协议项 WIN+R 输入regedit 打开注册表,在注册表HKEY_CLASSES_ROOT键中新建一个项,项的名字就是你伪协议的名字,例如我注册一个c ...

  10. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十四:储存模块

    实验十四比起动手笔者更加注重原理,因为实验十四要讨论的东西,不是其它而是低级建模II之一的模块类,即储存模块.接触顺序语言之际,“储存”不禁让人联想到变量或者数组,结果它们好比数据的暂存空间. . i ...