ASN.1入门简介

ASN语法

模块定义

模块是一系列数据结构与操作的集合,定义方式如下:

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:模式与长度不确定的任意字节流
IMG ::= OCTET STRING
image IMG ::= '3EF2F23BCAD24441EB'H
  • BOOLEAN:模拟一个具有两种状态的变量值
finish ::= BOOLEAN
  • INTEGER:可以限定整数值的范围
DayOfMonth ::= INTEGER{first(1),last(31)}(first..last)
myday DayOfMonth ::= 4 
  • REAL:以M*B^E的格式表示一个数的值
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:由一列整数构成,用于确定对象,例如算法或属性类型
ftam OBJECT IDENTIFIER ::= {iso standard 8571}

2. 复合类型(允许含有可选组件)

  • CHOICE:可嵌套的选择
Greet ::= [APPLICATION 12] CHOICE
{
    postcard   VisibleString,
    recording  Voice
}
Voice ::= CHOICE 
{
     english     OCTET STRING,
     swahili    OCTET STRING,     
}
myGreet Greet ::= recording:english:'012345678AD'H
  • ENUMERATED:用于表示状态数大于或等于3的变量值
Clothes ::= ENUMERATED{S(0),M(1),L(2),XL(3),XXL(4)}
myclothes Clothes ::= M
  • SEQUENCE:多个类型的有序集合,对应于C中的结构体
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:单一序列类型的集合,对应于C中的数组
Avengers ::= SEQUENCE OF VisibleString
firsttwo Avengers ::={
"caption",
"ironman"
}
  • SET:与SEQENCE类似,是无序的
  • SET OF:与SEQUENCE OF类似,是无序的

3. 标签类型(隐式标签和显式标签)

  • TAGGED TYPE

4. 其它类型

  • UTCTime
  • GeneralizedTime
  • ANY

ASN.1环境安装以及使用

asnLab上的方法

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

已有eclipse,所以按照官网步骤下载并安装即可。

  • ASN.1开发工具
  • ASN.1 c编译器与运行库
  • ASN.1 c++编译器与运行库
  • ASN.1 java编译器与运行库

其中后三个都需要lisence key才能工作,可以选择永久购买lisence key或者注册信息试用临时的lisence key(30天)。
得到lisence key之后,在窗口->首选项->ASN.1->Compiler中选择并填入对应的Serial Number即可,在工作台编辑asn文件并保存之后即自动生成对应语言文件。

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实现编码与解码
在生成的.java文件的xxx类中添加main函数,即编码并打印:

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类将无法编译并报错未定义的类型。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容