zoukankan      html  css  js  c++  java
  • 抽象语法符号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中定义的数据类型既有简单的基本数据类型,也有复杂的结构类型。

    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 编码子集入门指南

  • 相关阅读:
    Entity Framework 6 Recipes 2nd Edition(9-4)译->Web API 的客户端实现修改跟踪
    Entity Framework 6 Recipes 2nd Edition(9-3)译->找出Web API中发生了什么变化
    Entity Framework 6 Recipes 2nd Edition(9-2)译->用WCF更新单独分离的实体
    Entity Framework 6 Recipes 2nd Edition(9-1)译->用Web Api更新单独分离的实体
    jar包和war包的介绍和区别
    软件设计-高内聚耦合(转)
    Android中的dp,px以及wrap_content的实际展示效果
    Eclipse编辑器样式修改
    对TextView设置drawable,用setCompoundDrawables方法实现
    Android调用本机应用市场,实现应用评分功能
  • 原文地址:https://www.cnblogs.com/yuyutianxia/p/7049030.html
Copyright © 2011-2022 走看看