ASN.1入門簡(jiǎn)介

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ò)未定義的類型。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末雹熬,一起剝皮案震驚了整個(gè)濱河市宽菜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铅乡,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阵幸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡芽世,警方通過(guò)查閱死者的電腦和手機(jī)挚赊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)济瓢,“玉大人,你說(shuō)我怎么就攤上這事蔑鹦。” “怎么了举反?”我有些...
    開(kāi)封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵扒吁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我雕崩,道長(zhǎng),這世上最難降的妖魔是什么盼铁? 我笑而不...
    開(kāi)封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任饶火,我火速辦了婚禮鹏控,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抖僵。我一直安慰自己,他們只是感情好耍群,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布找筝。 她就那樣靜靜地躺著,像睡著了一般袖裕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沐祷,一...
    開(kāi)封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天嚷闭,我揣著相機(jī)與錄音攒岛,去河邊找鬼胞锰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嗅榕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凌那,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼帽蝶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了励稳?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤趣避,失蹤者是張志新(化名)和其女友劉穎新翎,沒(méi)想到半個(gè)月后程帕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡澎羞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年敛苇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片括饶。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡来涨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蹦掐,到底是詐尸還是另有隱情,我是刑警寧澤卧抗,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站拙绊,受9級(jí)特大地震影響泳秀,放射性物質(zhì)發(fā)生泄漏标沪。R本人自食惡果不足惜嗜傅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望违寞。 院中可真熱鬧币他,春花似錦坞靶、人聲如沸蝴悉。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至射众,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叨橱,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工愉舔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伙菜,地道東北人轩缤。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓贩绕,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親馏鹤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容