ASN.1(Abstract Syntax Notation One, 抽象文法描述语言), 它是一种跨平台的数据序列化的接口描述语言。

ASN.1对于大多数人来讲似乎很陌生,可能很多人没有听说过ASN.1,然而事实上它就应用在我们生活的周围。比如,欧洲和日本使用的移动电话基于TCAP消息协议的,TCAP消息协议中则采用的ASN.1描述的,使用了BER(Basic Encoding Rules)编码规则,共同实现了移动电话的呼叫。可以说,在一部移动电话与另一部电话之间通信时,是ASN.1协助实现了两部话机间的呼叫。此外,ASN.1和编码规则还被联邦快递用于大量地传输信息;大公司如HP/IBM/SUN等,使用ASN.1描述其打印机作业管理的标准接口。以及简单网络管理协议SNMP就是使用ASN.1对所有数据进行描述的。

ASN.1并没有提供单一的开源实现,而是作为一种规范来供第三方供应商实现的。ASN.1主要用在定义各种基础协议中,比如常用的LDAP,PKCS,GSM,X.500等。

ASN.1是一种对分布式计算机系统之间交换的数据信息进行抽象描述的规范化语言。以前,ASN.1只用于撰写国际通用标准,然而随着ASN.1软件工具的出现,ASN.1已经用于生成应用程序编程语言代码,称为各种消息系统应用的核心。现在ASN.1成为描述通信协议的标准文法,而且对通信协议的描述,不用再区分通信程序实现的编程语言和通信数据的原始表示,也不用再秋分应用系统的复杂或简单。

总之,ASN.1是一种国际标准,它为抽象数据结构的描述说明定义了一种记法。ASN.1使用抽象语法对各种编程语言定义的数据类型进行了重新定义,将所有数据分为两大类:基本类型(布尔类型,字符串类型,整型和比特串类型等)、结构类型(结构,链表和选择类型等)。

使用抽象语法描述的系统让设计者可以只关心系统的某部分,而不必关心系统中某一部分功能如何实现或者所代表的内容。


1. ASN.1的例子

既然ASN.1是一个描述语言,那么我们先来看一个直观的例子。ASN.1的基础是module, 我们看一下ASN.1中module的例子:

StudentCards DEFINITIONS AUTOMATIC TAGS ::= BEGINStudentCard ::= SEQUENCE {
dateOfBirthday DATE,
student    StudentInfo
}StudentInfo ::= SEQUENCE {
studentName    VisibleString (SIZE (3..50)),
homeAddress Address,
contactPhone   NumericString (SIZE (7..12))
}Address::= SEQUENCE {
street  VisibleString (SIZE (5 .. 50)) OPTIONAL,
city    VisibleString (SIZE (2..30)),
state   VisibleString (SIZE(2) ^ FROM ("A".."Z")),
zipCode NumericString (SIZE(5 | 9))
}END

上面的例子中,我们使用ASN.1定义了一个StudentCard,最外层的以BEGINEND包围的就是module。StudentCards是module的名字,首字母必须大写。

其中::= 是一个赋值符号。

module中可以有多个type, type的名字也必须首字母大写,例如上面的StudentCard,StudentInfo等等。

每个type中定义了它的组成组件,组件的名字首字母必须小写,这些组件的名字又叫做identifiers。

上面的dateOfBirthday后面接的DATE是ASN.1中内置的类型。而student后面的StudentInfo是一个自定义类型,并且同样包含在module中。

StudentInfo中的studentName是一个VisibleString,这个String的限制是size在3到50之间。

上面我们定义module的时候在module后面加上了AUTOMATIC TAGS,这是什么意思呢?

在ASN.1中,tags是ASN.1消息中每个组件的内部标识符,以Address为例,我们希望给Address中的每个属性都指定一个内部的标识符,如下所示:

Address::= SEQUENCE {
street  [0] VisibleString (SIZE (5 .. 50)) OPTIONAL,
city    [1] VisibleString (SIZE (2..30)),
state   [2] VisibleString (SIZE(2) ^ FROM ("A".."Z")),
zipCode [3] NumericString (SIZE(5 | 9))
}

这里面的[0] [1] 就是标识符,当然,我们可以在定义module的时候手动指定这些tags,但是如果我们使用AUTOMATIC TAGS,这些标识符会自动创建,从而避免了手动创建标识符可能带来的问题。


2. ASN.1中的内置类型

通过上面的讲解,我们对ASN.1有了一个基本的概念。如果想要对ASN.1进行更加深入的研究,那么我们首先要知道ASN.1中的内置类型。

一般来说ASN.1中有下面的数据类型:

2.1 基本类型

基本类型又称为原子类型,是构成其他结构类型的成员类型,主要包括:

  • 布尔类型:BOOLEAN

BOOLEAN和编程语言中的布尔值是一致的,它有两个可能得值:TRUE和FALSE。下面是具体而用法:

removed BOOLEAN ::= TRUE

  • 整型:INTEGER

INTEGER表示的是一个整数,如下所示,表示的是一个年例范围是0到100,最终的取值是18:

age INTEGER (0..100) ::= 18

  • 比特串:BIT STRING

字节的位表示方法,可以给一个byte中的每一个bit进行设值:

Status ::= BIT STRING {
married(0),
handsome(1),
kind(2)
}
myStatus Status ::= {handsome, kind}

上面的例子中,我们设置了Status,并且使用Status赋值给了一个变量myStatus。

  • 字节串:OCTET STRING

字节串是以字节为单位的任意字符串。

octetExample ::= OCTET STRING

  • DATE

表示日期,格式是"YYYY-MM-DD":

birthday DATE ::= "1990-11-18"

  • TIME-OF-DAY

表示日期中的时间,格式是"HH:MM:SS":

startTime TIME-OF-DAY ::= "09:30:00"

  • DATE-TIME

时间加日期的格式,它的格式"YYYY-MM-DDTHH:MM:SS",如下所示:

endTime DATE-TIME ::= "2022-01-10T18:30:23"

  • 浮点数:REAL

REAL表示的是一个浮点数,可以如下表示:

Amount ::= REAL

  • ENUMERATED

ENUMERATED表示的是一个枚举,它与编程语言中描述的枚举类型一样。可以如下表示:

Colors ::= ENUMERATED {black, red, white}
myColor Colors ::= white

  • IA5String

IA5String表示的是ASCII字符,并且包含有控制字符。

SampleString ::= IA5String

  • VisibleString

VisibleString表示的是ASCII字符,其中不包含有控制字符。

SampleString ::= VisibleString

  • NumericString

NumericString表示的是数字和空格。

SomeNumber ::= NumericString

  • UTF8String

UTF8String表示的是Unicode字符

UnicodeString ::= UTF8String

  • NULL

是一个空值,用来占位。


2.2 结构类型

结构类型又称为符合类型,主要包括:

  • 有序成员固定结构:SEQUENCE

SEQUENCE表示的是项目的序列合集,在使用前已经确定数据成员的个数和顺序的结构体类型。如下所示:

StudentInfo ::= SEQUENCE {
name VisibleString,
phone NumericString
}
max StudentInfo ::= {name "J.Max", phone "18888888888"}

  • 有序成员待定结构:SEQUENCE OF

SEQUENCE OF表示的是一个list,在使用前已经确定数据成员数据,使用是才确定数据成员的个数的结构体链表类型。如下:

breakTimes SEQUENCE OF TIME-OF-DAY ::= {"10:00:00", "12:00:00", "14:45:00"}

  • 无序成员固定结构:SET

在使用前已经确定数据成员的个数,但未确定数据成员顺序的结构体类型。

  • 无序成员待定结构:SET OF

使用时才确定数据成员的个数和顺序的结构体链表类型。

  • 选择类型:CHOICE

CHOICE由几种数据类型的数据成员构成的共同体类型。表示从众多的item中选择一个:

Identity ::= CHOICE {
name VisibleString,
phone VisibleString,
idCard VisibleString
}
jack Identity ::= name: "jack"


3. ASN.1中的限制语法

ASN.1中可以定义很多个字段,有些字段可能会有一些限制,比如手机号只能用数字,名字有长度限制等。

这些限制在ASN.1中叫做Constraints,一般来说有下面的一些限制:

  • FROM

FROM提供了一个数据值的读取范围,如下:

PermittedChars ::= IA5String (FROM("ABCDEFG1244"))

PermittedChars只允许从"ABCDEFG1244"选择。

  • PATTERN

PATTERN表示的是正则表达式,如下所示:

phoneNumber ::= IA5String (PATTERN "1[0-9]#10")

上面列出的是一个简单的手机号码的正则表达式。

  • SIZE

SIZE可以表示字符串的长度或者数组的长度:

       Name ::= IA5String (SIZE (4..7))
       NameList ::= SEQUENCE SIZE (1..25) OF Name

  • RANGE

使用..可以表示一个范围:

Age ::= INTEGER (0..100)

  • 单一值

从提供的值列表中挑选一个:

Colors ::= UTF8String ("Blue" | "White")


4. 小结

ASN.1抽象文法描述的优势,在应用系统消息协议中,特别是大型消息协议如电子商务体系中证书认证系统和支付系统协议等方面得到了发挥。使得ASN.1文法描述越来越得到系统设计和软件开发人员的一致认可,并且被更为广泛地应用。

ASN.1接口描述语言详解相关推荐

  1. Android HIDL HAL 接口定义语言详解

    1. HIDL 概述 在 Andoird 8.0 版本框架代码中,加入了 HIDL(HAL 接口定义语言),HIDL 的出现是为了将用户层和 HAL 层分割开,它指定了 HAL 和用户之间的接口,让用 ...

  2. 【视频课】图像分割最新内容来了(言有三新录制4部分实例分割算法详解)

    课程介绍 图像分割在直播,电商,自动驾驶等行业中有着广泛的应用,有三AI此前推出了<深度学习之图像分割-理论实践篇>课程,让你以最短的时间掌握深度学习图像分割的基础知识并进行代码实践. 我 ...

  3. UML(Unified Modeling Language)统一建模语言--类图详解

    UML(Unified Modeling Language)统一建模语言--类图详解   2010-05-12 作者:fenglin1985 来源:fenglin1985的blog   类图是面向对象 ...

  4. ASN.1 常用类型 编码详解 入门

    文章目录 编码结构 标识符 Identifier 长度 Length 短形式 长形式 内容 Contents 基本类型 布尔类型 BOOLEAN 整形 INTEGER 实数 REAL 枚举类型 ENU ...

  5. java data使用_@Data注解详解及使用方法-Fun言

    @Data作用 去除Getter,Setter,equals,hashCode,toString方法,@Data注解在类上时,简化java代码编写,为该类提供读写属性.简单来说就是不用再手动添加get ...

  6. 阿里P8架构师谈:从单体架构、到SOA、再到微服务的架构设计详解

    本文涉及的内容以及知识点如下: 1.单体架构 2.单体架构的拆分 3.SOA与微服务的区别 4.微服务的优缺点 5.微服务的消息 6.服务集成 7.数据的去中心化 单体架构 Web应用程序发展的早期, ...

  7. android Json解析详解

    JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语 言的支持),从而可以在不同平台间进行数 ...

  8. float属性html,详解CSS样式中的float属性

    详解CSS样式中的float属性.float是 css 样式的定位属性.我们在印刷排版中,文本可以按照需要围绕图片.一般把这种方式称为"文本环绕".在网页设计中,应用了CSS的fl ...

  9. 科技基建,自主创芯——详解全球半导体制造行业格局

    来源:芯潮 今天推荐一份报告,详解全球半导体制造行业格局,本报告从以下几个角度进行分析: 一.全球半导体制造市场规模及竞争格局 全球半导体制造市场及行业格局 中国半导体制造行业情况 二.半导体制造制程 ...

最新文章

  1. PHP支付宝接口RSA验证
  2. 云炬Android开发笔记 17商品详情功能开发
  3. python操作mysql_使用Python操作MySQL的一些基本方法
  4. P3723 [AH2017/HNOI2017]礼物(FFT)
  5. 【原创】Kakfa utils源代码分析(一)
  6. bzoj2561 最小生成树
  7. [设计模式] ------ 观察者模式和他的升级版发布订阅模式
  8. python文本菜单程序_从〇到一: Python GUI 程序:记事本
  9. 人工智能产业链深度透析—产业应用医疗篇
  10. 红帽企业linux 6.4 64位上实现mysql 5.6主从复制_红帽企业Linux 6.4 64位上实现MySQL 5.6主从复制...
  11. mysql的部分数据主从复制_MySQL主从复制数据不一致的办法部分原因
  12. php mpdf 乱码,PHPMPDF中文乱码如何解决
  13. python 获取复数的实部和虚部
  14. 英文期刊催稿信模板_SCI论文催稿信模板
  15. Dota 2 with Large Scale Deep Reinforcement Learning翻译
  16. 网易云的特色与优势?|网易云
  17. Mentor Graphics LP Wizard 软件使用----创建零件BGA封装库
  18. 国科大学习资料--最优化计算方法(王晓)--第六次作业答案
  19. Error:python-neutron conflicts with python2-eventlet-0.18.4-1.el7.noarch(安装openstack-neutron出现的问题解决)
  20. ps基础学习:图案图章工具画布填充

热门文章

  1. 西门子官方资料库地址集
  2. mysql中文排序,自定义排序(一科,二科,三科,四科等等)
  3. PDF合同生成下载预览
  4. 4169: DNA序列---复制问题
  5. TRT使用之pycuda安装
  6. cuda编程 pycuda
  7. 2764和6264地址范围
  8. [docker] docker学习笔记(一)
  9. AHK 2017年教学视频导航页面:
  10. 【STM32H7教程】第63章 STM32H7的高分辨率定时器HRTIM基础知识和HAL库API