加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

ASN.1简介

发布时间:2020-12-16 00:22:52 所属栏目:大数据 来源:网络整理
导读:? ASN.1简介 分类:? ASN.12010-12-16 16:05? 157人阅读 ? 评论(0) ? 收藏? 举报 什么是ASN.1 ??? ASN.1是 Abstract Syntax Notation one×(抽象语法标记语言) 的缩写,是以「定义信息的结构」为目的语言,是由ISO和ITU-T规定的一套标准。 ??? 本来的目的
?

ASN.1简介

分类:? ASN.12010-12-16 16:05? 157人阅读? 评论(0)? 收藏? 举报

什么是ASN.1

??? ASN.1是Abstract Syntax Notation one×(抽象语法标记语言)的缩写,是以「定义信息的结构」为目的语言,是由ISO和ITU-T规定的一套标准。

??? 本来的目的是为了定义以及记述PDU(Protocol Data Unit的缩写,可以理解为协议的内容),经常在计算机之间交换传输消息(协议)的时候被使用。

??? ASN.1在机能上并不仅仅局限于协议层,各个阶层数据的表现都可以万能地使用ASN.1来表述。

??? 根据ASN.1构造而定义的信息被称为「ASN.1 Object」。

ASN.1 对象

??? 在计算机的世界里如果提到「对象」这个词的话,一般是指带有某种「信息」或者「机能」的具有固定格式的数据,这种「对象」一般都被人们恰当地划分为各种类型(Type),类型决定了「信息」的保存方法以及「机能」的使用方法。

??? ASN.1根据下面的两个属性来构造信息。反过来说的话,如果确定了下面的两个属性,ASN.1对象就能够被定义。

  • 信息的名字
  • 信息的类型

??? 前一节提到了ASN.1是抽象语法标记语言,既然是语言,那么就可以用普通的ASCII文本来记述。所谓「ASN.1文本」即是指下面这种形式的文本:

????????Age?::= INTEGER

? ? ? ?

??? 意思是:名字为Age的ASN.1对象保存了类型为INTEGER的信息。

??? 「::=」符号在这里标识了这样的意思:「左边的值是作为右边的数据结构的符号(类似于变量名之类的东西)来使用」。

?

??? ASN.1对象的类型一旦被定义了,那么这个对象所能保存的值的种类或者数目也就被自动的决定了,例如:「整数」类型的ASN.1对象只能用来表示「50」,「-126」,「99999」等这样的整数值。

?

??? 所谓类型(Type)即是指INTEGER(整数),OCTET STRING(Octet列),PrintableString(文字列),BOOLEAN(真伪)等,具体请参看表。

??? 另外,类型也可以表达复数个值,复数个类型的集合也是一种类型,例如下面这样的定义中,SEQUENCE就是这样一种可以表达复数个类型组合的一种类型:

????????Price ::= SEQUENCE {

??????????? amount INTEGER

??????????? scale? PrintableString

??????? }

??? 上面这段ASN.1定义的意思是:

  • 命名为Price的ASN.1对象保存了识别名分别为amount和scale的成员。
  • 识别名为amount的成员保存INTEGER(整数)类型的信息。
  • 识别名为scale的成员保存PrintableString(文字列)类型的信息。

???? SEQUENCE也可以作为其他ASN.1对象的内部类型来使用,也就是说可以作为其他ASN.1对象的值来保存数据,想象成C语言中的结构体的话会更容易理解,比如像下面这样的定义

??????? ??? IsFemale ::= BOOLEAN
???????? Price ::= SEQUENCE {
???????? ?? amount INTEGER
??????????? scale PrintableString
???????? }
???????? Person ::= SEQUENCE {
??????????? age INTEGER
??????????? gender IsFemale
??????????? price Price
???????? }

?????同C中的结构体相同,ASN.1对象也允许使用者来定义自己的数据构造,与C语言不同的是,ASN.1的构造应该能够转换为二进制列编码,毕竟,在信息的构造定义和比特列之间相互转换是ASN.1的职责所在。

??? 能够直接转换为二进制编码的类型成为「基本类型」。比如BOOLEAN,INTEGER,ENUMERATE,REAL,BIT STRING,OCTET STRING,NULL,OBJECT IDENTIFIER,SEQUENCE等,详细请参照「Tag field」这一节。相反的,不是基本类型的类型,即是指可以进一步细分化的一些类型,我们将在后文介绍。

???

ASN.1对象的实例

????我们使用ASN.1定义了信息的结构(构造)之后,就可以基于这个构造来实际生成ASN.1对象了,这里所说的「生成」指的是「带有具体的值」的意思。「带有实际具体值的ASN.1对象」我们就称之为「ASN.1对象的实例」。

例如:

?

ASN.1

实例

Age ::= INTEGER

Age = 20

?

一般地,ASN.1只定义信息的构造,而不定义具体的值。为ASN.1对象赋值是其他应用程序应该做的工作。实例在计算机内部具体的以什么样的形式来保存,这个问题也是依赖于具体的处理系的,比如perl的hash,C语言的构造体等。但是,这样的话在将实例传递给其他处理系进行处理的时候,就可能会产生问题(其他的处理系可能使用不同的方法来处理实例)。为了解决这样的问题,考虑对实例的表现应使用相同的约束,这个也就是传说中的「BER」编码。下文将对BER相关的知识进行说明。

?

参考资料:

ITU-T X.680

ITU-T X.690

转自:http://blog.csdn.net/yinyang007/article/details/6080351

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读