如何看懂描述SNMP中MIB的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”
 }

 

转载:http://www.cppblog.com/chenrj/archive/2007/11/10/36291.aspx

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