English

ASN.1 Java编译器使用入门

学习任何语言或标记的最好方法莫过于读它的例子。在本节中教程中,我们将引导您创建并运行一个简单的ASN.1应用。更多详细信息,请参阅ASN.1 Java编译器用户指南。

安装ASN.1 Java编译器

点击 这里 查看如何下载和安装的ASN.1 SDK和ASN.1 C++编译器插件的说明。

设置License Key

申请一个试用License或从ASN Lab网站购买一个永久License。 在Eclipse中,选择Windows (在Mac机器, Eclipse) > Preferences > ASN.1 > ASN.1 Java Compiler打开ASN.1 Java Compiler首选项页面。在General section中输入License Key,然后点击 OK。

MyHTTP例子

MyHTTP例子改编自 http://www.w3.org/Protocols/HTTP-NG/asn1.html, 它是一个FHTTP GET请求的简化形式。 对于我们的例子,假设我们需要应用以下我们已经在ASN.1开发工具 使用入门中看到过的ASN.1模块。

  1. 选择 File > New > Project...
  2. ASN.1 类目中, 选择 ASN.1 Project, 然后点击 Next.
  3. 工程名输入 'MyHTTP' 然后点击 Finish.
  4. 现在ASN.1 文件可以添加到项目中,通过从其他地方复制到项目的源目录,或者按从以下步骤零开始创建ASN.1文件:
  5. 选择 File > New > Other...
  6. ASN.1 类目中, 选择 ASN.1 Module, 然后点击 Next.
  7. 模块名中输入 'MyHTTP' 然后点击Finish.
  8. 在开启的编辑器中输入以下的源代码:
    MyHTTP DEFINITIONS
    AUTOMATIC TAGS ::=
    BEGIN
    
       GetRequest ::= SEQUENCE {
          header-only   BOOLEAN,
          lock          BOOLEAN,
          accept-types  AcceptTypes,
          url           Url,
          ...,
          timestamp     GeneralizedTime
       }
    
       AcceptTypes ::= SET {
          standards   BIT STRING { html(0), plain-text(1), gif(2), jpeg(3) } (SIZE(4)) OPTIONAL,
          others      SEQUENCE OF VisibleString (SIZE(4)) OPTIONAL
       }
    
       Url ::= VisibleString (FROM("a".."z"|"A".."Z"|"0".."9"|"./-_~%#"))
    
       myRequest GetRequest ::= {
          header-only  TRUE,
          lock         FALSE,
          accept-types {
             standards { html, plain-text }
          },
          url          "www.asnlab.org",
          timestamp    "20121221121221Z"
       }
    
    END
  9. 保存ASN.1 文件, 编译好的Java类文件将自动生成(如果没有,请检查License Key是否设置好)。
  10. 创建一个Java项目test, 然后添加ASN.1 Java运行库到编译路径。
  11. 复制生成的Java类文件到项目的合适的包(本例中是"MyHTTP") 目录。
  12. 在项目中创建类TestMyHttp.java,输入如下内容:
    import java.io.ByteArrayOutputStream;
    import java.util.Calendar;
    
    import MyHTTP.AcceptTypes;
    import MyHTTP.GetRequest;
    import MyHTTP.Standards;
    
    
    public class TestMyHttp {
    
       public static void main(String[] args) throws Exception {
          GetRequest getRequest=new GetRequest();
          getRequest.header_only=true;
          getRequest.lock=false;
          getRequest.accept_types=new AcceptTypes();
          getRequest.accept_types.standards=new Standards(new byte[1],(byte)4);
          getRequest.accept_types.standards.setHtml();
          getRequest.accept_types.standards.setPlain_text();
          getRequest.url="www.asnlab.org";
          Calendar cal = Calendar.getInstance();
          cal.set(Calendar.YEAR, 2012);
          cal.set(Calendar.MONTH, Calendar.DECEMBER);
          cal.set(Calendar.DAY_OF_MONTH, 21);
          cal.set(Calendar.HOUR_OF_DAY, 12);
          cal.set(Calendar.MINUTE, 12);
          cal.set(Calendar.SECOND, 21);
          cal.set(Calendar.MILLISECOND, 0);
          cal.set(Calendar.ZONE_OFFSET, 0);
          getRequest.timestamp = cal.getTime();
          ByteArrayOutputStream bos=new ByteArrayOutputStream();
          getRequest.ber_encode(bos);
          byte[] bs=bos.toByteArray();
          for(int i=0; i<bs.length; i++) {
             System.out.printf("%02X ", bs[i] & 0xFF);
          }
       }
    
    }
  13. 编译该项目,如果自动编译Build automatically被关掉。
  14. 右击文件 TestMyHttp.java 然后选择 Run as > Java Application:

    30 2D 80 01 FF 81 01 00 A2 04 80 02 04 C0 83 0E 77 77 77 2E 61 73 6E 6C 61 62 2E 6F 72 67 84 0F 32 30 31 32 31 32 32 31 31 32 31 32 32 31 5A

BER编码后的逐字节逐比特的含义:

0x30 -- [0011|0000], [UNIVERSAL, CONSTRUCTED, 16(SEQUENCE)] - GetRequest
0x2D -- [0010|1101], length 45

0x80 -- [1000|0000], [CONTEXT, PRIMITIVE, 0(BOOLEAN)] GetRequest.header_only
0x01 -- [0000|0001], length 1
0xFF -- [0000|1111], value TRUE

0x81 -- [1000|0001], [CONTEXT, PRIMITIVE, 1(BOOLEAN)] GetRequest.lock
0x01 -- [0000|0001], length 1
0x00 -- [0000|0000], value FALSE

0xA2 -- [1010|0010], [CONTEXT, CONSTRUCTED, 2(SET)] - GetRequest.accept_types
0x04 -- [0000|0100], length 4

0x80 -- [1000|0000], [CONTEXT, PRIMITIVE, 0(BIT STRING)] AcceptTypes.standards
0x02 -- [0000|0010], length 2
0x04 -- [0000|0100], 4 unused bits
0xC0 -- [1100|0000], {html, plaint_text}

0x83 -- [1000|0011], [CONTEXT, PRIMITIVE, 3(VisibleString)] GetRequest.url
0x0E -- [0000|1100], length 14
0x77 0x77 0x77 0x2E 0x61 0x73 0x6E 0x6C 0x61 0x62 0x2E 0x6F 0x72 0x67 -- www.asnlab.org

0x84 -- [1000|0011], [CONTEXT, PRIMITIVE, 4(GeneralizedTime)] GetRequest.timestamp
0x0F -- [0000|1100], length 15
0x32 0x30 0x31 0x32 0x31 0x32 0x32 0x31 0x31 0x32 0x31 0x32 0x32 0x31 0x5A -- 20121221121221Z

更多信息

关于ASN.1 Java运行库的更多信息, 请参阅ASN.1 Java运行库用户指导