有一种密码学专用语言叫做ASN.1
文章目录
- 简介
- ASN.1的例子
- ASN.1中的内置类型
- ASN.1中的限制语法
- 总结
简介
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 ::= 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,最外层的以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相关推荐
- 会c 学plc编程语言,想学PLC编程?先弄清5种PLC专用语言!
PLC目前有5种标准的编程语言,包含图形化编程语言和文本化编程语言. 图形化编程语言包含:梯形图(LD-Ladder Diagram).功能块图(FBD - Function Block Diagra ...
- 自动化学计算机语言先学什么,要入门PLC编程 先搞清这5种专用语言
原标题:要入门PLC编程 先搞清这5种专用语言 PLC,(Programmable Logic Controller),乃是一种电子装置,早期称为顺序控制器"Sequence Control ...
- 领域专用语言(DSL)简介
原文地址:http://blog.csdn.net/u010278882/article/details/50554299 主要回答几下几个问题 1 什么是 DSL 2 为什么使用 DSL 3 ...
- 编程语言哪家强?4种数据分析领域语言优缺点对比
来源:大数据DT(ID:hzdashuju)本文约2600字,建议阅读5分钟"哪门语言更好"?本文介绍了4种数据分析领域语言的优缺点. 编程语言的好坏及排行之争由来已久." ...
- mysql是面向对象的语言吗_php一种面向对象的语言,那么什么是面向对象呢?
php一种面向对象的语言,那么什么是面向对象呢? 传统的面向过程的编程思想: 相信很多人第一次接触编程都是c语言,c语言就是非常典型的面向过程的编程语言,将要实现的功能描述为一个从开始到结束的连续的& ...
- python基于什么语言-一种基于Python语言的EDA开发平台及其使用方法与流程
本发明涉及EDA开发的技术领域,尤其是指一种基于Python语言的EDA开发平台及其使用方法. 背景技术: 目前,主流的EDA设计语言Verilog HDL能实现完整的芯片硬件逻辑电路开发,但是其代码 ...
- EMNLP2018论文解读 | 三种提升多语言翻译模型的高效策略
本文(<三种提升一对多多语言翻译策略>)是搜狗和中科院自动化所合作发表在 EMNLP 2018 上的工作.搜狗翻译目前采用业界领先的神经网络机器翻译框架支持 60 种以上不同语言之间的互译 ...
- Less (一种动态样式语言)
Less (一种动态样式语言). LESS是一种由Alexis Sellier设计的动态层叠样式表语言,受Sass所影响,同时也影响了 Sass的新语法:SCSS. LESS是开源的,其第一个版本由R ...
- c语言股票软件开发,一种使用Objcctivc语言开发的股票软件系统的制作方法
本法发明基于移动IOS,使用Objcctivc-C语言技术,涉及一种使用Objcctivc语言开发的股票软件系统. 背景技术: 随着人们对移动炒股的需求越来越高,手机炒股软件也在不断进步,目前市场上充 ...
最新文章
- valgrind安装使用
- 为什么华为在发布会不提鸿蒙,华为又要开发布会?这次没有手机,鸿蒙系统要当主角!...
- Ubuntu文件的复制、移动和删除命令
- Android 自带图标库 android.R.drawable
- 安装python模块时出现:error: Setup script exited with error: command 'gcc' failed with exit status 1...
- java 一个大事务下的新增、修改、查询_重新学习Mysql数据库8:MySQL的事务隔离级别实战...
- JavaScript 拾碎[一] ECMAScript 简介
- 刷新存储器的容量单位是什么_存储系统 半导体存储器
- 深度强化学习落地指南:弥合DRL算法原理和落地实践之间的断层 | 文末送书
- 小a的计算器(牛客签到题A)-简单模拟
- 计算机网络【三】物理层数据通信
- 漫画:优秀程序员的必备特质有哪些?
- pcs7服务器没有报警信息,PCS7服务器报警重启(工程师培训).pdf
- 【解决方法】如何压缩网页字体文件
- 2019牛客暑期多校训练营(第九场) F	Birthday Reminders(dp)
- python自动化测试面试题大全带答案_Python自动化测试笔试面试题精选
- 小米 红米Note(联通3G版)解BL锁教程 申请BootLoader解锁教程
- JSON对象数组去重
- 自媒体时代网红电子商务
- 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java动漫衍生品交易平台z25so