简介

ASN.1是一种跨平台的数据序列化的接口描述语言。可能很多人没有听说过ASN.1, 但是相信有过跨平台编程经验的同学可能都听过protocol buffers和Apache Thrift,虽然ASN.1和上面两个语言相比不是那么出名,但是ASN.1的出现要比他们早的多,早在1984年ASN.1就出现了。

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

ASN.1是一种和平台、语言无关的描述语言,可以使用很多ASN.1的翻译工具,将ASN.1翻译成为C, C++, Java等代码。

ASN.1的例子

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

StudentCards DEFINITIONS AUTOMATIC TAGS ::= BEGIN

StudentCard ::= 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,最外层的以BEGIN和END包围的就是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,这些标识符会自动创建,从而避免了手动创建标识符可能带来的问题。

ASN.1中的内置类型

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

一般来说ASN.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

8进制表示的字符串:

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
  • 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"}
  • CHOICE

CHOICE表示从众多的item中选择一个:

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

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

SampleString ::= IA5String
  • VisibleString

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

SampleString ::= VisibleString
  • NumericString

NumericString表示的是数字和空格。

SomeNumber ::= NumericString
  • UTF8String

UTF8String表示的是Unicode字符

UnicodeString ::= UTF8String
  • NULL

是一个空值,用来占位。

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")

总结

以上就是ASN.1数据结构描述语言的基本介绍了,有了这些基础,我们就可以很容易读懂使用ASN.1来描写的数据结构了。

更多内容请参考 http://www.flydean.com/46-asn-1/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

有一种密码学专用语言叫做ASN.1的更多相关文章

  1. Less (一种动态样式语言)

    Less (一种动态样式语言). LESS是一种由Alexis Sellier设计的动态层叠样式表语言,受Sass所影响,同时也影响了 Sass的新语法:SCSS. LESS是开源的,其第一个版本由R ...

  2. 应用AXIS开始Web服务之旅(soap web services)——使用三种不同的语言访问创建的Web服务,分别是JAVA、VB、VC

    一. 介绍 本文并不是想介绍Web服务的原理.系统架构等,我们假设您已经了解了关于Web服务的一些基本的概念.原理等知识.本文主要是针对那些已经了解Web服务概念,但是还没有亲身体会Web服务所带来令 ...

  3. [转载] 详述三种现代JVM语言--Groovy,Scala和Clojure

    转载自http://www.tuicool.com/articles/jYzuAv和http://www.importnew.com/1537.html 在我与Martin Fowler曾经合作呈现的 ...

  4. 几种不同程序语言的HMM版本

    几种不同程序语言的HMM版本 “纸上得来终觉浅,绝知此事要躬行”,在继续翻译<HMM学习最佳范例>之前,这里先补充几个不同程序语言实现的HMM版本,主要参考了维基百科.读者有兴趣的话可以研 ...

  5. php一种面向对象的语言,那么什么是面向对象呢?

    php一种面向对象的语言,那么什么是面向对象呢? 传统的面向过程的编程思想: 相信很多人第一次接触编程都是c语言,c语言就是非常典型的面向过程的编程语言,将要实现的功能描述为一个从开始到结束的连续的“ ...

  6. less 一种 动态 样式 语言

    LESS « 一种动态样式语言 http://www.bootcss.com/p/lesscss/ 一种 动态 样式 语言. LESS 将 CSS 赋予了动态语言的特性,如 变量, 继承,运算, 函数 ...

  7. Linus:C++是一种糟糕的语言

    本文内容摘自http://blog.csdn.net/turingbook/article/details/1775488 C++是一种糟糕的(horrible)语言.而且因为有大量不够标准的程序员在 ...

  8. 数值的三种表示--C语言

    在C语言中,数值常数可以是3中形式: (1)在数值前面加0表示的是8进制数据: (2)在数字前面加0x表示的是16进制数: (3)在数值前面什么也不加,表示的是10进制数值.        目前C语言 ...

  9. 1.1 Python是一种什么样的语言

    小时不识月,呼作白玉盘.很多人习惯地说Python不过是一种脚本语言而已,实际上这种说法是非常不准确的,完全不能体现出Python的强大.严格来说,Python是一门跨平台.开源.免费的解释型高级动态 ...

随机推荐

  1. 有了 Promise 和 then,为什么还要使用 async?

    有了 Promise 和 then,为什么还要使用 async? 本文写于 2020 年 5 月 13 日 最近代码写着写着,我突然意识到一个问题--我们既然已经有了 Promise 和 then,为 ...

  2. SpringBoot Redis 实践指南

    前言 SpringBoot Cache 是一个很好的缓存框架,可以兼容多种缓存实现,数据量较大的情况下,Redis 应该是最多被使用的. 本文重点介绍 SpringBoot 和 Redis 整合使用的 ...

  3. elementUI 输入框用户名和密码取消自动填充

    <!-- 用户名取消自动填充 autocomplete="off" --> <el-form-item label="用户名" prop=&q ...

  4. 使用C#和MonoGame开发俄罗斯方块游戏

    小的时候就看到有同学使用C语言在DOS下做过一款俄罗斯方块的游戏,当时是启用了DOS的图形化模式,感觉也挺有意思.最近上海疫情封控在家,周末也稍微有点空余时间,于是使用Visual Studio 20 ...

  5. .NET C#杂谈(1):变体 - 协变、逆变与不变

    0. 文章目的:   介绍变体的概念,并介绍其对C#的意义 1. 阅读基础   了解C#进阶语言功能的使用(尤其是泛型.委托.接口) 2. 从示例入手,理解变体   变体这一概念用于描述存在继承关系的 ...

  6. App自动化之dom结构和元素定位方式(包含滑动列表定位)

    900×383 38 KB 先来看几个名词和解释: dom: Document Object Model 文档对象模型 dom应用: 最早应用于html和js的交互.界面的结构化描述, 常见的格式为h ...

  7. 开始讨论离散型随机变量吧!《考研概率论学习之我见》 -by zobol

    上一文中,笔者给出了随机变量的基本定义:一个可测映射,从结果空间到实数集,我们的目的是为了引入函数这个数学工具到考研概率论中,但是我们在现实中面对的一些事情结果,映射而成的随机变量和其对应的概率值,并 ...

  8. WPF第三方控件,只能输入数字型数据

    话不多说,根据最近项目需求,为了减少输入验证等相关代码量,需要此控件 先上效果图 默认样式是这样,自己可以根据需求修改外形,但我更喜欢它自带的简洁版 有人可能会问怎么实现的呢?其实很简单,我们设置它的 ...

  9. 监控pos收银机

    1.打开pos收银机snmp功能 控制面板-->程序和功能-->启用或关闭windows功能→简单网络管理协议(SNMP) 2.配置snmp服务 控制面板-->管理工具-->服 ...

  10. Java获取当天或者明天等零点时间(00:00:00)0时0分0秒的方法

    SimpleDateFormat sdfYMD = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar calendar = ...