ASN語(yǔ)法
模塊定義
模塊是一系列數(shù)據(jù)結(jié)構(gòu)與操作的集合博投,定義方式如下:
ModuleDefinition ::=
ModuleIdentifier
DEFINITIONS
TagDefaule
ExtensionDefault
"::="
BEGIN
ModuleBody
END
類型
1. 常用的簡(jiǎn)單類型(原子的)
- BIT STRING:一個(gè)BIT字串
DaysOfTheWeek ::= BIT STRING{
sunday(0),monday(1),tuesday(2),wednesday(3),thursday(4),friday(5),saturday(6)
}(SIZE(0..7))
sunnyDays1 DayOfTheWeek ::={sunday,monday,saturday}
sunnyDays2 DayOfTheWeek ::='1100001'B
- OCTET STRING:模式與長(zhǎng)度不確定的任意字節(jié)流
IMG ::= OCTET STRING
image IMG ::= '3EF2F23BCAD24441EB'H
- BOOLEAN:模擬一個(gè)具有兩種狀態(tài)的變量值
finish ::= BOOLEAN
- INTEGER:可以限定整數(shù)值的范圍
DayOfMonth ::= INTEGER{first(1),last(31)}(first..last)
myday DayOfMonth ::= 4
- REAL:以M*B^E的格式表示一個(gè)數(shù)的值
pi REAL ::={
mantissa 3141592653589793238462643383279,
base 10,
exponent -30
}
X-Real ::= REAL (WITH COMPONENTS{
mantissa (16777215..16777215),
base(2),
exponent (-125..128)
})
girth X-Real ::= {
mantissa 16,
base 2,
exponent 1
}
- OBJECT IDENTIFIER:由一列整數(shù)構(gòu)成黔衡,用于確定對(duì)象,例如算法或?qū)傩灶愋?/li>
ftam OBJECT IDENTIFIER ::= {iso standard 8571}
2. 復(fù)合類型(允許含有可選組件)
- CHOICE:可嵌套的選擇
Greet ::= [APPLICATION 12] CHOICE
{
postcard VisibleString,
recording Voice
}
Voice ::= CHOICE
{
english OCTET STRING,
swahili OCTET STRING,
}
myGreet Greet ::= recording:english:'012345678AD'H
- ENUMERATED:用于表示狀態(tài)數(shù)大于或等于3的變量值
Clothes ::= ENUMERATED{S(0),M(1),L(2),XL(3),XXL(4)}
myclothes Clothes ::= M
- SEQUENCE:多個(gè)類型的有序集合炕淮,對(duì)應(yīng)于C中的結(jié)構(gòu)體
HERO ::= SEQUENCE{
Name VisibleString,
Age INTEGER{first(1),last(100)}(first..last)
Talent BIT STRING{Warrior(0), Mage(1), Tank(2), Priest(2), Ranger(3)}(SIZE(0..3))
}
punch HERO ::={
name "onepunch",
age 28,
talent '10100'B
}
- SEQUENCE OF:?jiǎn)我恍蛄蓄愋偷募希瑢?duì)應(yīng)于C中的數(shù)組
Avengers ::= SEQUENCE OF VisibleString
firsttwo Avengers ::={
"caption",
"ironman"
}
- SET:與SEQENCE類似,是無(wú)序的
- SET OF:與SEQUENCE OF類似川慌,是無(wú)序的
3. 標(biāo)簽類型(隱式標(biāo)簽和顯式標(biāo)簽)
- TAGGED TYPE
4. 其它類型
- UTCTime
- GeneralizedTime
- ANY
ASN.1環(huán)境安裝以及使用
asnLab上的方法
ASNLab地址: https://www.asnlab.cn/
已有eclipse,所以按照官網(wǎng)步驟下載并安裝即可祠乃。
- ASN.1開(kāi)發(fā)工具
- ASN.1 c編譯器與運(yùn)行庫(kù)
- ASN.1 c++編譯器與運(yùn)行庫(kù)
- ASN.1 java編譯器與運(yùn)行庫(kù)
其中后三個(gè)都需要lisence key才能工作梦重,可以選擇永久購(gòu)買lisence key或者注冊(cè)信息試用臨時(shí)的lisence key(30天)。
得到lisence key之后亮瓷,在窗口->首選項(xiàng)->ASN.1->Compiler中選擇并填入對(duì)應(yīng)的Serial Number即可琴拧,在工作臺(tái)編輯asn文件并保存之后即自動(dòng)生成對(duì)應(yīng)語(yǔ)言文件。
asn1c使用
命令行進(jìn)入到asn1c目錄嘱支,輸入命令:
asn1c ../xxx.asn
得到三個(gè)文件分別為:xxx.c/xxx.h/makefile.asn.sample
JAC使用
下載JAC后蚓胸,命令行進(jìn)入其中的lib文件夾,輸入命令:
java -jar JAC.jar -d [target_path] -p [target_filename] [source_file]
則在[target_path][target_filename]目錄下得到一個(gè)文件為:xxx.java
編碼:
java中使用encode與decode實(shí)現(xiàn)編碼與解碼
在生成的.java文件的xxx類中添加main函數(shù)除师,即編碼并打优嫔拧:
public static void main(String []args) {
//編碼
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
BerOutputStream out = new BerOutputStream(outStream);
HERO one = new HERO();
one.name.setValue("punchhhhhhhh");
one.age.setValue(28);
one.talent.setValue("tank");
try {
one.encode(out);
System.out.println(out.toString());
}catch (java.io.IOException e1){
System.out.println(e1);
}
//解碼
ByteArrayInputStream inputStream;
BerInputStream in;
inputStream = new ByteArrayInputStream(outStream.toByteArray());
in = new BerInputStream(inputStream);
HERO decode_hero = new HERO("decode_hero");
try {
decode_hero.decode(in);
System.out.println("hero.name=" + decode_hero.name.getValue() + "\nhero.talent=" + decode_hero.talent.getValue());
} catch (IOException e) {
e.printStackTrace();
}
}
需要注意的是JAC3.0只支持SELECTICE ,SEQUENCE汛聚,SEQUENCE OF锹安,SET,SET OF倚舀,BOOLEAN叹哭,INTEGER,ENUMERATED痕貌,ANY风罩,BIT STRING,IA5String芯侥,NULL泊交,OBJECT IDENTIFIER,OCTET STRING廓俭,PRINTABLE STRING,UTCTime這幾類asn類型的編譯研乒,如果使用其他類型比如VisibleString的話,生成的java類將無(wú)法編譯并報(bào)錯(cuò)未定義的類型。