网易首页 > 网易号 > 正文 申请入驻

有一种密码学专用语言叫做ASN.1

0
分享至

简介

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/ 最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现! 欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
欧盟玩“产能把戏”难逃中方反制

欧盟玩“产能把戏”难逃中方反制

风铃草语
2026-06-01 06:13:39
震撼!超150万人参加阿森纳夺冠游行 赖斯高歌:定位球又来了哈哈

震撼!超150万人参加阿森纳夺冠游行 赖斯高歌:定位球又来了哈哈

风过乡
2026-06-01 06:07:36
该用的时候雷霆偏偏不用他,不该用的时候雷霆又非要充分信任他?

该用的时候雷霆偏偏不用他,不该用的时候雷霆又非要充分信任他?

稻谷与小麦
2026-05-31 22:53:45
胡杏儿带三个儿子拍摄,帅气程度堪比“炸街”,母子四人太有型了

胡杏儿带三个儿子拍摄,帅气程度堪比“炸街”,母子四人太有型了

情感大头说说
2026-05-31 21:22:06
黄仁勋公开放话,华为韬定律要比台积电落后10年,结果成国际笑话

黄仁勋公开放话,华为韬定律要比台积电落后10年,结果成国际笑话

胖福的小木屋
2026-05-31 13:26:25
为什么往死里扫黄?网友分享太真实了,一次说透

为什么往死里扫黄?网友分享太真实了,一次说透

另子维爱读史
2026-05-27 20:16:03
雷霆止步西决后,美媒提议惊天交易:米切尔换杰威+华莱士

雷霆止步西决后,美媒提议惊天交易:米切尔换杰威+华莱士

温柔且自由
2026-06-01 00:43:18
唐嫣素颜进幼儿园!6岁女儿戴皇冠萌翻全场,罗晋全程冷脸零互动

唐嫣素颜进幼儿园!6岁女儿戴皇冠萌翻全场,罗晋全程冷脸零互动

优墨出品
2026-05-30 08:57:35
年会上我当众递辞职信,董事长见年终奖只有88元,全场看向经理

年会上我当众递辞职信,董事长见年终奖只有88元,全场看向经理

千秋文化
2026-05-29 19:54:56
负债824亿、账上只剩82亿:一群猪,把700亿富豪逼上了悬崖

负债824亿、账上只剩82亿:一群猪,把700亿富豪逼上了悬崖

历史伟人录
2026-05-31 18:28:28
A股:大家做好准备!明天(6月1日)的市场会这样走

A股:大家做好准备!明天(6月1日)的市场会这样走

风风顺
2026-06-01 04:15:03
1499元,特斯拉为Model Y推出手动车顶遮阳帘

1499元,特斯拉为Model Y推出手动车顶遮阳帘

金融界
2026-05-31 17:00:10
Gill盛赞15岁小将:从未见过如此天才,他是世界最佳之一

Gill盛赞15岁小将:从未见过如此天才,他是世界最佳之一

元气满分吖
2026-05-31 00:18:41
红米618狠降价!骁龙8至尊+7100mAh,不到2000?

红米618狠降价!骁龙8至尊+7100mAh,不到2000?

小兔子发现大事情
2026-06-01 05:52:18
楼市王炸大招原来是收购二手房?终于明白最近各地开始加速收购了

楼市王炸大招原来是收购二手房?终于明白最近各地开始加速收购了

专业聊房君
2026-05-31 12:17:34
忙活一桌子,狗都不吃!丈夫过生日,妻子自我感动 ,网友吐槽

忙活一桌子,狗都不吃!丈夫过生日,妻子自我感动 ,网友吐槽

蝴蝶花雨话教育
2026-05-31 00:05:20
全队唯一正负值为正数的球员!但雷霆却不愿意给他多些出场时间?

全队唯一正负值为正数的球员!但雷霆却不愿意给他多些出场时间?

稻谷与小麦
2026-05-31 22:23:35
在北京的年轻人,怎么流行买地铁吊环了?

在北京的年轻人,怎么流行买地铁吊环了?

不相及研究所
2026-05-31 22:20:49
徐帆回应离婚才9个月,68岁冯小刚和养女贴脸拍照亲密 ,关系很好

徐帆回应离婚才9个月,68岁冯小刚和养女贴脸拍照亲密 ,关系很好

沧海一书客
2026-05-31 18:08:08
600架无人机连夜绞杀!核导弹造成83伤,联合国急呼无条件停火

600架无人机连夜绞杀!核导弹造成83伤,联合国急呼无条件停火

混沌录
2026-05-30 23:41:14
2026-06-01 07:07:00
flydean程序那些事
flydean程序那些事
最通俗的解读,最深刻的干货!
356文章数 438关注度
往期回顾 全部

科技要闻

戴尔诺基亚又回来了!AI重估老牌科技公司

头条要闻

伊朗总统被指已向最高领袖提出辞职 官方回应

头条要闻

伊朗总统被指已向最高领袖提出辞职 官方回应

体育要闻

阿森纳用最悲壮的方式,成就了巴黎王朝

娱乐要闻

朱军退休,正义虽迟但到,女方受惩

财经要闻

医学首席转岗搞科技,A股科技股遭遇巨震

汽车要闻

900V+3.2秒破百 领克10+&领克10上市16.99万元起

态度原创

时尚
教育
本地
亲子
军事航空

梓渝:慢下来,也很好

教育要闻

山东专科填报底层逻辑 时

本地新闻

用剪纸的方式,打开江苏扬州

亲子要闻

幼童高烧半月险窒息,竟是一根带鱼刺“游”进了脖颈深处!

军事要闻

解放军代表质问日防卫大臣:日本何时道歉

无障碍浏览 进入关怀版