一、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. 学习下新塘M0芯片的下载方法

    编程方式多种多样,解释这几种方式的原理,方便做后续的回答: 一.脱机 脱机的意思就是脱离PC机,有很多芯片必须连接PC才能烧录,比如某些FPGA芯片.MCU芯片.NAND Flash芯片等.脱机和在线 ...

  2. JDBC批量加密数据库密码

    package com.lxc.wmb; import java.io.UnsupportedEncodingException; import java.security.MessageDigest ...

  3. AD采样模块采集带模拟量真空表值的实验

    实验采用带模拟量,分辨率为1-5V,量程为0--101kpa的真空表 数据采集模块采用DAM-8021,  16位模块 算法描述如下: 真空表读数范围: 0到-101kpa 模拟量输出: 1-5V 一 ...

  4. NC 的高级应用

    高级用法: (1)作攻击程序用,例子: 格式1:type.exe c:\exploit.txt|nc -nvv 192.168.x.x 80 格式2:nc -nvv 192.168.x.x 80 &l ...

  5. linux常用命令大全3--rpm安装软件

    RPM 包 - (Fedora, Redhat,CentOS及类似系统) rpm -ivh package.rpm 安装一个rpm包 rpm -ivh --nodeeps package.rpm 安装 ...

  6. Egret IDE中搜索,过滤文件,只搜索.ts

    刚开始忘了这个搜索条件在哪里打开了,后来找着了,记录一下 = =!

  7. yii---获取当前sql语句

    我们在用YII开发项目的时候,会查看当前执行的SQL语句来排查错误,那么YII该如何获取当前的SQL语句呢? $list = user::find()->where(['title'=>$ ...

  8. CmD空格转义的三种方法,总有一种会解决问题

    CmD空格转义 在cmd中,如果路径中存在空格报错 可以有三种解决方法: 1.将存在空格的路径用双引号包起来,如:"D:/Program Files/xx"; 2.将存在空格的名称 ...

  9. markdown公式编辑参考

    原文作者,https://www.cnblogs.com/q735613050/p/7253073.html

  10. PostgreSql数据库查询表信息/列信息(列ID/列名/数据类型/长度/精度/是否可以为null/默认值/是否自增/是否是主键/列描述)

    查询表信息(表名/表描述) select a.relname as name , b.description as value from pg_class a ) b on a.oid = b.obj ...