ASN.1入門簡介

ASN語法

模塊定義

模塊是一系列數(shù)據(jù)結(jié)構(gòu)與操作的集合,定義方式如下:

ModuleDefinition ::=
          ModuleIdentifier
DEFINITIONS
          TagDefaule
          ExtensionDefault
"::="
BEGIN
          ModuleBody
END

類型

1. 常用的簡單類型(原子的)

  • BIT STRING:一個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:模式與長度不確定的任意字節(jié)流
IMG ::= OCTET STRING
image IMG ::= '3EF2F23BCAD24441EB'H
  • BOOLEAN:模擬一個具有兩種狀態(tài)的變量值
finish ::= BOOLEAN
  • INTEGER:可以限定整數(shù)值的范圍
DayOfMonth ::= INTEGER{first(1),last(31)}(first..last)
myday DayOfMonth ::= 4 
  • REAL:以M*B^E的格式表示一個數(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)成,用于確定對象,例如算法或?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:多個類型的有序集合,對應(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:單一序列類型的集合,對應(yīng)于C中的數(shù)組
Avengers ::= SEQUENCE OF VisibleString
firsttwo Avengers ::={
"caption",
"ironman"
}
  • SET:與SEQENCE類似,是無序的
  • SET OF:與SEQUENCE OF類似,是無序的

3. 標簽類型(隱式標簽和顯式標簽)

  • TAGGED TYPE

4. 其它類型

  • UTCTime
  • GeneralizedTime
  • ANY

ASN.1環(huán)境安裝以及使用

asnLab上的方法

ASNLab地址: https://www.asnlab.cn/

已有eclipse,所以按照官網(wǎng)步驟下載并安裝即可。

  • ASN.1開發(fā)工具
  • ASN.1 c編譯器與運行庫
  • ASN.1 c++編譯器與運行庫
  • ASN.1 java編譯器與運行庫

其中后三個都需要lisence key才能工作,可以選擇永久購買lisence key或者注冊信息試用臨時的lisence key(30天)。
得到lisence key之后,在窗口->首選項->ASN.1->Compiler中選擇并填入對應(yīng)的Serial Number即可,在工作臺編輯asn文件并保存之后即自動生成對應(yīng)語言文件。

asn1c使用

命令行進入到asn1c目錄,輸入命令:
asn1c ../xxx.asn
得到三個文件分別為:xxx.c/xxx.h/makefile.asn.sample

JAC使用

下載JAC后,命令行進入其中的lib文件夾,輸入命令:
java -jar JAC.jar -d [target_path] -p [target_filename] [source_file]
則在[target_path][target_filename]目錄下得到一個文件為:xxx.java

編碼:

java中使用encode與decode實現(xiàn)編碼與解碼
在生成的.java文件的xxx類中添加main函數(shù),即編碼并打?。?/p>

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類將無法編譯并報錯未定義的類型。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容