asn.1 學習筆記

ASN.1即抽象語法符號,用來定義應用程序數據和表示協議數據單元的抽象語言。優點是獨立於機器、語言及應用程序的內部表示。適用於描述現代通信中複雜的、變化的、可擴展的數據結構。比如3G和VoIP均採用了ASN.1。

      ASN.1分兩大部分:語法規則和編碼規則。

語法規則

1. ASN.1定義示例

Age  ::= INTEGER (0..120)

User ::= SEQUENCE {

         name    IA5String (SIZE(1..128)),

         age     Age DEFAULT 18,

         address  IA5String OPTIONAL,

         ...

       }

 

2. 簡單類型

基本類型

字符串類型

對象類型

其它類型

 

3. 構造類型

SEQUENCE,對應於C語言中的struct

SEQUENCE OF,對應於數組

SET,類似於SEQUENCE,但不考慮分量順序

SET OF,集合類型,每一分量類型相同,不考慮順序

 

4. 類型定義

語法:   typereference ::= Type

示例:

1) Counter      ::= INTEGER

2) UserAccount ::= SEQUENCE {

    username PrintableString,

    password PrintableString,

    account INTEGER

}

 

5. 賦值

語法: valuereference Type ::= Value

示例:

1) current Counter  ::= 1234

2) myAccount UserAccount ::= {

    username “tly”,

    password “guesswhat”,

    account 2345

}

編碼規則

1. BER

1) 三種情況及其格式:

a.簡單類型(Primitive),定長;

Identifier  |  Length  |  Content

b.構造類型(Constructed),定長;

Identifier  |  Length  |  I | L | C | I | L | C | ...

c.構造類型(Constructed),不定長;

Identifier  |  Length  |  I | L | C | I | L | C | EOC|

 

2) Identifier編碼

格式:   8     7     6     5    4    3    2    1

            Class    | P/C |     Tag    number

分兩種情況:

a.Tag number < 31

b.Tag number >= 31

 

3) Length及Content編碼

分三種情況:

a.短形(L < 128),定長

b.長形(L >= 128),定長

c.不定長,僅用於構造類型

 

4) 示例

a.INTEGER 49

0000 0010   0000 0001   0011 0001

 

b.UserAccount ::= SEQUENCE {

    username IA5String,

    account INTEGER

}

myAccount UserAccount ::= {

    username “john”,

    account 129

}

 

0011 0000  0000 1010

0001 0110  0000 0011

0100 1010  0110 1111

0110 1000  0110 1110

0000 0010  0000 0010

0000 0000  1000 0001

 

2. DER

爲確保編碼的唯一性,出現了CER和DER兩種編碼方案,它們均爲BER子集。其中DER只使用定長編碼,CER基於不定長編碼。

 

3. PER

在PER中,tag從不傳送,length和value如果雙方都知道,也不需傳送。因此,其編碼更精簡,效率更高。

1) 格式

preamble  |   length   |  contents

preamble:只出現在ENUMERATED、SEQUENCE、SET、CHOICE四種數據結構的編碼中。用來記錄結構中有無擴展項(extension)、選擇項(optional)或缺省項(default);

length: 對STRING、SEQUENCE OF、SET OF等數據類型進行編碼時,需對其長度按對齊方式進行編碼;

contents:若數據是基本結構類型,如:BOOLEAN、INTERGER、REAL、BITSTRING等,即可直接進行編碼;若數據是複合結構類型,如 SEQUENCE、SET、CHOICE、SEQUENCE  OF 等,則屬嵌套編碼,此時contents中也包含有preamble、length、contents三個部分。

 

2) 示例

a. cug-Index  INTEGER(1..256)的值爲10時,PER編碼爲(pad)00001001

b. error  CHOICE

{

  systemErr   NULL,

  operationErr  NULL,

  …

}

      若error值爲systemErr,則PER編碼爲00。

 

4. XER

即XML Encoding Rules,主要應用於網站開發,本文不作介紹。

 

結束語:

      本文介紹了抽象語法符號1(ASN.1)的概念和數據表示方式,對BER編碼過程給出了較詳細的說明和示例,同時也簡要地介紹了ASN.1的其它編碼方法,如DER, PER, XER等。最近因學習3GPP之故,本人剛剛接觸ASN.1,難免有疏漏和錯誤,還請各位給予指正,同時也歡迎大家互相交流學習。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章