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,難免有疏漏和錯誤,還請各位給予指正,同時也歡迎大家互相交流學習。