ASN.1 入门

一、介绍
Abstract Syntax Notation One (ASN.1)是一种独立于机器的描述语言,用于描述在网络上传递的消息
 标准包括:  ISO 8824-1 | ITU-T X.680: Specification of basic notation,
 ISO 8824-2 | ITU-T X.681: Information object specification,
 ISO 8824-3 | ITU-T X.682: Constraint specification,
 ISO 8824-4 | ITU-T X.683: Parameterization of ASN.1
ASN.1特别适合表示现代通信应用中那些复杂的、变化的及可扩展的数据结构
ASN.1 可分为两个部分
       语法规则:从数据类型、内容顺序或结构等方面来描述消息的内容
       编码规则:如何编码实际消息中的数据
特点:
       表达简单和复杂类型的能力
       可对类型根据大小及(或)数值进行约束
       也可以施加更强的约束
       字段可标记为 OPTIONAL
       大写开头表示类型名,小写开头的表示变量名/字段名

二、ASN.1术语
       1.抽象语法(Abstract Syntax)
 描述通用数据结构
 允许定义数据类型和值
       2.数据类型(Data Type)
 值的集合,可以是简单类型或结构类型
 可以对数据类型命名
       3.编码(Encoding)
 用于表示数据值的字节序列
       4.编码规则(Encoding Rules)
 给出从一种语法到另一种的映射方法
       5.传输语法(Transfer Syntax)
 位模式(Bits pattern)
 描述数据是在传输时是如何表示的

三、ASN.1模块定义
       模块(module):ASN.1规范中的基本构造块
模块定义格式如下:

<modulereference> DEFINITIONS ::=
 BEGIN
  EXPORTS 
  IMPORTS 
  AssignmentList
 END
其中:EXPORTS 这个模块中的定义可能被其他模块引入
           IMPORTS 定义由其他模块引入
          AssignmentList 这个模块中将定义类型分配、值分配及宏定义


四、ASN.1简单类型
         1. 基本类型:BOOLEAN,INTEGER,ENUMERATED,REAL,BIT STRING,OCTET STRING
         2. 字符串类型(ISO10646-1的子集)
 NumericString (0-9,<space>)
 PrintableString (0-9,A-Z,a-z,<space>,<s[ecial>
 VisibleString
 GraphicString
 UTF8String
 IA5String (ASCII)
         3. 对象类型
 OBJECT IDENTIFIER 
 ObjectDescriptor 对象标识符:一个任意长的非负整数序列,用于标记对象(如算法等)
         4. 其它类型
 NULL 空值
 UTCTime
  yymmdd hhmm[ss] <local offset from UTC>
 GeneralizedTime
  yyyymmdd hhmm[ss] <local offset from UTC>
  强制从2050年开始

五、ASN.1类型定义
语法:   <type name> ::= <type>
        示例:
 Counter ::= INTEGER
 IpAddress ::= OCTET STRING
 Months    ::= ENUMERATED {
   january (1), february (2), march (3),
   april (4), may (5), june (6),
   july (7), august (8), september (9),
   october (10), november (11), december(12)
 }
六、ASN.1子类型定义
语法: <subtype name> ::= <type> (<constraint>)
        示例:
 Counter  ::= INTEGER (0..65536)
 IpAddress  ::= OCTET STRING ( SIZE(4) )
 Spring     ::= Months (march | april | may)
 Summer     ::= Months (june | july | august )
 SmallPrime ::= INTEGER ( 2 | 3 | 5 | 7 | 11 )
 ExportKey  ::= BIT STRING ( SIZE(40) )


七、ASN.1赋值
语法: <value name> <type> ::= <value>
        示例:
 ipInReceives Counter  ::= 2450
 ipRouteMask IpAddress ::= ‘FFFFFF00’H
 currentMonth Months   ::= july
 currentTime UTCTime   ::= “030708094018+0800”
 name VisibleString    ::= “John”
 married BOOLEAN       ::= TRUE
 faxMessage BIT STRING ::= ‘01100001101’B

 internet OBJECT IDENTIFIER ::= { iso(1) org(3) dod(6) 1 }
 private OBJECT IDENTIFIER ::= { internet 4 }

八、ASN.1结构类型
        SEQUENCE 对应于C语言中的struct
 类型定义
 UserAccount ::= SEQUENCE {
     username PrintableString,
     password PrintableString,
     accountNr INTEGER
 }
         赋值
 myAccount UserAccount ::= {
     username “tly”,
     password “guesswhat”,
     accountNr 2345
 }
      SEQUENCE OF 对应于C语言中的数组
 类型定义
 MemberCountries ::= SEQUENCE OF PrintableString
 AccountRegistry ::= SEQUENCE OF UserAccount
 赋值
 eastAsia MemberCountries ::= {
     “China”, “Japan”, “Korean”, “DPR”
 }
     SET 类似于SEQUENCE,但不考虑分量顺序
 类型定义
 UserAccount ::= SET {
     username [0] PrintableString,
     password [1] PrintableString,
     accountNr [2] INTEGER
 }
 赋值
 myAccount UserAccount ::= {
     accountNr 2345,
     username “tly”,
     password “guesswhat”
 }
     SET OF 集合类型,每一分量类型相同,不考虑顺序
 类型定义
 Keywords ::= SET OF PrintableString
 赋值
 someASN1Keywords Keywords ::= {
     “INTEGER”, “BOOLEAN”, “REAL”
 }

ASN.1介绍

出处:http://asn1.elibel.tm.fr/en/introduction/index.htm
翻译:ddonwi([email protected])  
说明:我是第一次接触ASN.1,不知道它是什么东东,所以找了这份资料,边读边翻译,希望高手能通过这篇指出我理解上存在的错误,让我能够正确的理解ASN.1
最后修订日期:2004.3.20

主要概念

ASN.1 是通信协议中描述数据传输的正式标记(notation),它与语言实现和物理表示无关,与应用的复杂度无关。

ASN.1(Abstract Sysntax Notation number One 抽象语法标记)是定义抽象数据类型规格形式的标准。

它提供了一系列预定义的基本类型,诸如:
integers (INTEGER),
booleans (BOOLEAN),
character strings (IA5String, UniversalString...),
bit strings (BIT STRING),
...
并且它可以定义结构类型,比如:
structures (SEQUENCE),
lists (SEQUENCE OF),
choice between types (CHOICE),
...

子类型(Subtyping)约束也可以应用于任何ASN.1类型,用来限制类型的值的范围。

与很多其他的声称可扩展的语法不同,ASN.1 提供了处理和支持早期配置系统与新系统、新版本与老版本之间交互的可扩展性。

ASN.1 发送任何形式(音频、视频、数据等等)的信息都必须用数字传送。ASN.1只能包含信息的结构方面(没有已经定义的或考虑到的处理数据值的操作)。它不是一个编程语言。

 ASN.1成功的一个主要理由是它采用了一些如BER(Basic Encoding Rules) 或新制定的PER(Packed EncodingRules)这样的标准化的编码规则,它对受带宽限制的应用程序很有用。这些编码规则描述了如何将定义在ASN.1中的值译成适合传输的电码(例如:他们可以被转化为可传输的字节,或反向转化),其与机器、编程语言或者在应用程序中的表示无关。ASN.1的编码方式比很多竞争者更先进,能够快速并可靠的传输可扩展信息--这是无线带宽的一个优势。由于从1982年以后ASN.1已经成为一个国际标准,所以它的编码规则是成熟的并且它有长期的可靠性和互用性的跟踪记录。

几乎所有操作系统上的工具都支持ASN.1,ASN.1也支持如java,c和c++这样流行的编程语言,和包括COBOL这样的较老的编程语言。ASN.1的广泛性的一个例子是,有很多工具已经支持超过150种不同的计算机平台。
 
有大量经过检验的ASN.1工具已经被长期使用。使用这些工具,可以更快的将新产品带入市场,至少,可以召回那些没有经过有效测试的基于新代码的产品。
  
个案研究

假如一个公司拥有一个连接了数个销售网点的仓库,进货保存在这个仓库里 ,出货从这个仓库中调出。这个公司需要一个具有以下特征的协议:
定单收集在本地销售网点处;
它们被发送到仓库,在那里管理着交付货物手续;
通过客户的要求,交付的回执必须送回销售网点做下一步处理。

协议可以被表示为下列的两个ASN.1模块:
      
 Module-order DEFINITIONS AUTOMATIC TAGS ::=
BEGIN

Order ::= SEQUENCE {
  header  Order-header,
  items   SEQUENCE OF Order-line}

Order-header ::= SEQUENCE {
  number   Order-number,
  date     Date,
  client   Client,
  payment  Payment-method }

Order-number ::= NumericString (SIZE (12))

Date ::= NumericString (SIZE (8)) -- MMDDYYYY

Client ::= SEQUENCE {
  name     PrintableString (SIZE (1..20)),
  street   PrintableString (SIZE (1..50)) OPTIONAL,
  postcode NumericString (SIZE (5)),
  town     PrintableString (SIZE (1..30)),
  country  PrintableString (SIZE (1..20))
               DEFAULT default-country }
default-country PrintableString ::= "France"

Payment-method ::= CHOICE {
  check        NumericString (SIZE (15)),
  credit-card  Credit-card,
  cash         NULL }

Credit-card ::= SEQUENCE {
  type         Card-type,
  number       NumericString (SIZE (20)),
  expiry-date  NumericString (SIZE (6)) -- MMYYYY -- }

Card-type ::= ENUMERATED { cb(0), visa(1), eurocard(2),
                 diners(3), american-express(4) }

Order-line ::= SEQUENCE {
  item-code    Item-code,
  label        Label,
  quantity     Quantity,
  price        Cents }

Item-code ::= NumericString (SIZE (7))

Label ::= PrintableString (SIZE (1..30))

Quantity ::= CHOICE { unites       INTEGER,
                      millimetres  INTEGER,
                      milligrammes INTEGER }

Cents ::= INTEGER

Delivery-report ::= SEQUENCE {
  order-code   Order-number,
  delivery     SEQUENCE OF Delivery-line }

Delivery-line ::= SEQUENCE { item  Item-code,
                             quantity Quantity }

END

Protocol DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
IMPORTS Order, Delivery-report, Item-code, Quantity,
        Order-number FROM Module-order ;

PDU ::= CHOICE { question CHOICE {
                   question1 Order,
                   question2 Item-code,
                   question3 Order-number,
                   ... },
                 answer  CHOICE {
                   answer1   Delivery-report,
                   answer2   Quantity,
                   answer3   Delivery-report,
                   ... }}
END

你可能感兴趣的:(数据结构,String,object,Integer,语言,encoding)