为什么要有ASN.1这个东西?
我们知道,像C++、Java这种高级语言,对于计算机来说都要转化为二进制代码才能识别和操作。这就涉及到序列化和反序列化这两个概念,将一个对象序列化成二进制代码,就可以保存成文本或者利用网络传输到远程,与序列化相对的,就是反序列化,从文本或者网络中读取的二进制代码就可以变换成最初的对象。
就好比网购一个桌子,商家把桌腿桌板螺丝钉拆开,并附上安装教程一起打包快递,我收到后,按照教程重新将桌子组装起来。
为了解决高级语言中结构化数据在网络传输中的结构关系能送达目的地进行还原,历史上出现了以下几种数据序列化的方法:ASN.1,XML,Json等。
ASN.1是什么?
ASN.1(abstract syntax notation one)是一种对分布计算机系统之间交换的数据信息进行抽象描述的规范化语言。抽象语法只描述数据的结构形式,与具体的编码格式无关,同时也不涉及这些数据结构在计算机内如何存放。
ASN.1把我们在高级编程语言定义的比如int、string和bool这些数据结构重新定义,将所有的数据结构分为两大类:基本类型和结构类型。
基本类型:
布尔 |
BOOLEAN |
整型 |
INTEGER |
比特串 |
BIT STRING |
空 |
NULL |
对象标识 |
OBJECT INDENTIFIER |
可打印字符串 |
PrintableString |
IA5字符串 |
IA5String |
可见字符串 |
VisibleString |
数字字符串 |
NumericString |
BMP字符串 |
BMPString |
枚举类型 |
Enumerated |
UTC时间类型 |
UTCTime |
Generalized时间类型 |
GeneralizedTime |
任意类型 |
ANY |
|
|
复合类型:
有序成员固定结构 |
SEQUENCE |
无序成员固定结构 |
SET |
有序成员待定结构 |
SEQUENCE OF |
无须成员待定结构 |
SET OF |
选择类型 |
CHOICE |
经过ASN.1重定义后的数据类型几乎涵盖了现实生活中绝大部分的数据类型,具有通用性。
ASN.1只是约定了数据抽象描述,并不限定它的编码规则。对于同一个ASN.1描述的数据,用户可以根据自己的需求使用不同的编码规则进行编码。
目前ASN.1的标准编码规则有:BER(Basic Encoding Rules)、CER(Canonical Encoding Rules)、DER(Distinguished Encoding Rules)、PER(Packed Encoding Rules)和XER,XML Encoding Rules)。