zoukankan      html  css  js  c++  java
  • 2020课程设计 Week1 Asn.1格式的学习

    2020课程设计 Week1 Asn.1格式的学习

    一、简介

    • ASN.1(Abstract Syntax Notation dotone),抽象语法标记1。是定义抽象数据类型形式的标准,是用于描述数据表示、表示、传输、编码的记法。

    • ASN.1只包含信息结构,不处理具体业务数据,它不是一个编程语言

    • ASN.1没有限定编码方法,各种ASN.1编码规则提供了由ASN.1描述其抽象句法的数据的值的传送语法(具体表达),常见的编码规则有:基本编码规则(BER),规范编码规则(CER,CanonicalEncoding Rules)唯一编码规则(DER,DistinguishedEncoding Rules)压缩编码规则(PER,PackedEncoding Rules)和XML编码规则(XER,XMLEncoding Rules)。这些编码规则描述了如何将定义在ASN.1中的值译成适合传输的电码。

    • ASN.1在OSI的ISO8824/ITU X.208(说明语法)ISO8825/ITU X.209(说明基本编码规则)规范。

    • 几个概念:

    • 实际语法:指诸如C、ObjectiveCaml等这样实际编程语言;
    • 抽象语法(AbstractSyntax):指ASN.1,是协议采用ASN.1规范描述的描述文本。描绘了与任何表示数据的编码技术无关的通用数据结构。抽象语法使得人们能够定义数据类型,并指明这些类型的值。抽象语法只描述数据的结构形式,与具体的编码格式无关,同时也不涉及这些数据结构在计算机内如何存放。
    • 传输语法(TransferSyntax):指表示层交换数据的表示方法,是实际通讯系统间的码流。当数据在两个表示层实体之间传输时,这些数据的实际比特模式表示方法就是传送语法。
    • 编码:指将抽象语言法转换成实际通讯系统间比特流;
    • 编码规则:将抽象语言法转换成实际通讯系统间比特流所遵循的语法规则;

    二、ASN.1的基本语法规则

    • ASN.1使用巴科斯范式(BNF):
    • 在双引号中的字("word")代表着这些字符本身。而double_quote用来代表双引号。
    • 在双引号外的字(有可能有下划线)代表着语法部分。
    • 尖括号(< > )内包含的为必选项。
    • 方括号([ ] )内包含的为可选项。
    • 大括号({ } )内包含的为可重复0至无数次的项。
    • 竖线(| )表示在其左右两边任选一项,相当于"OR"的意思。
    • ::=是“被定义为”的意思。
    • 在ASN.1中,符号的定义没有先后次序:只要能够找到该符号的定义即可。
    • 所有的标识符、参考、关键字都要以一个字母开头,后接字母(大、小写都可以)、数字或者连字符“-”(但不能以连字符“-”结尾,也不能连续出现两个连字符),不能出现下划线“_”。注释以--开头,以--或行尾结束。
    • 关键字一般都是全部大写。
    • 在标识符中,只有类型和模块名字是以大写字母开头的,其它标识符都是以小写字母开头。
    • ASN.1中实数实际定义为三个整数:尾数、基数和指数。没有小数表示方式。
    • ASN.1不对空格、制表符、换行符和注释做翻译。但是在定义符号(或者分配符号Assignment)“::=”中不能有分隔符。

    三、ASN.1中的类型

    类型是一个非空的值的集合,可以被编码后传输。相比与高级语言中复杂的数据结构,ASN.1中的类型主要是为了数据的传输。

    ASN.1中的类型分为基本类型(内建数据类型)和组合类型,组合类型由一个或多个基本类型构成。

    1.基本类型

    类型 含义
    BIT STRING 比特串
    BOOLEAN 布尔型
    INTEGER 整数
    NULL 空值
    OBJECT IDENTIFIER 对象标识符
    OCTET STRING 字节串
    PrintableString 可打印字符串
    UTCTime “协调世界时”
    GeneralizedTime 通用时间

    2.构造类型

    • 复杂事物可以视为简单的事物集合或序列。
    • 集合是顺序无关的,而序列是顺序有关的。
    • 构造类型被用来描述复杂的事物,包括若干字段(简单类型或其他构造类型)。
    • ASN.1定义了四种构造方式,描述有序和无序的各种情况。

    2.1SEQUENCE

    • 表示1个或多个字段组成的有序序列,例如:

       ReportEntry ::= SEQUENCE { 
         author OCTET STRING, 
         title OCTET STRING, 
         body OCTET STRING, 
         biblioBook Bibliography 
         } 
      
    • 用户定义的类型名和标识符大小写规定
      类型名 首字母为大写的驼峰式,如“ReportEntry”
      标识符 首字母为小写的驼峰式,如“biblioBook”

    2.2SEQUENCE OF

    • 表示0个或多个特定类型字段的有序序列,例如:

       Report ::= SEQUENCE SIZE (100) OF ReportEntry
       Report ::= SEQUENCE SIZE (MAX) OF ReportEntry
      

    2.3SET

    • 表示1个或多个字段组成的无序集合,例如:

       Menu ::=SET{
       	sandwich Food,
       	coke Beverage
       }
      

    2.4SET OF

    • 表示0个或多个特定类型字段的无序集合,例如:

       Class ::= SET SIZE (50) OF Student
      

    2.5使用ASN.1编写一个数据结构

    • 基于各种构造方式,将基本数据类型经过层次嵌套,最终构造出能描述任何抽象事物的数据结构。

    • 例如:

         Bibliography ::= SEQUENCE { 
         	author OCTET STRING 
         	title OCTET STRING 
         	publisher OCTET STRING 
         	year OCTET STRING 
         } 
      

    3.其他关键字

    • CHOICE:从若干类型中选择其一即可
    • ANY:构造类型中的某字段依赖于 其他字段的值 (ANY DIFINED BY)
    • OPTIONAL:构造类型中某字段可选
    • DEFAULT:指定构造类型中某字段的缺省值
  • 相关阅读:
    [redis] redis在线系统热迁移的方案与记录
    [golang] go get无法安装官方软件包
    我有关编程语言的一点理解
    [nginx] nginx源码分析--健康检查模块锁分析
    [nginx] nginx的hash与bucket size分析
    [daily][linux] dmesg格式里的时间为什么不准
    [daily] 查看linux程序或操作的kernel内核调用栈
    [go] 像gdb一样使用dlv debug golang程序
    [tls][https][nginx] https的client session cache与session ticket机制分析
    [性能优化] CPU电源管理pstate cstate
  • 原文地址:https://www.cnblogs.com/Brass/p/12711196.html
Copyright © 2011-2022 走看看