ASN.1简介

来源:互联网 发布:视频网站程序 linux 编辑:程序博客网 时间:2024/05/15 23:51
 

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

原创粉丝点击