2012-01-27 63 views
0

我想在Java中实现一些协议。为了做到这一点,我使用BinaryNotes编译器和他们的API库,但我坚持这个例子。这是我的ASN1输入文件:卡住BinaryNotes编译器

Test 
DEFINITIONS ::= 
BEGIN 
    OPERATION ::= CLASS 
    { 
     &Argument OPTIONAL, 
     &opCode Code UNIQUE OPTIONAL 
    } 
    WITH SYNTAX 
    { 
     [ARGUMENT &Argument] 
     [CODE &opCode] 
    } 

    OperationA OPERATION ::= 
    { 
     ARGUMENT Arg 
     CODE global:{org(0) operA(1) ver(1) id(1)} 
    } 

    Code ::= CHOICE 
    { 
     local INTEGER, 
     global OBJECT IDENTIFIER 
    } 

    Arg ::= SEQUENCE 
    { 
     operationID INTEGER, 
     value ArgValue 
    } 

    ArgValue ::= OCTET STRING (SIZE(1..25)) 
END 

,这里是国阵的编译器输出:

  1. 编译文件:test1.asn
  2. 线4:9:意外的标记:操作
  3. line 6:17:unexpected char:'&'

我应该如何修改我的输入asn1文件,以便用bn编译器成功编译它。 在此先感谢。

回答

0

BinaryNotes不支持新的ASN.1类语法,对不起! 人们也为CODE global:{org(0) operA(1) ver(1) id(1)} 不支持你可以用ASN.1基本尝试这样的:

DEFINITIONS ::= 
BEGIN 
    OPERATION ::= SEQUENCE 
    { 
     argument Arg OPTIONAL, 
     code Code OPTIONAL 
    } 


    Code ::= CHOICE 
    { 
     local INTEGER, 
     global OBJECT IDENTIFIER 
    } 

    Arg ::= SEQUENCE { 
    } 
+0

谢谢你。我在想你的建议,但我不确定应该使用SEQUENCE而不是CLASS。再次感谢你。 – nick79 2012-01-27 13:46:20

+0

没问题,但你必须知道BinaryNotes只支持基本的通用ASN.1语法(实际上我是这个框架的作者:)) – abdolence 2012-01-27 19:23:59

+0

我很抱歉,因为你停止了框架的开发:) – nick79 2012-01-28 15:24:57

1

请注意,一个类不能被改变的序列。这可能会消除较旧编译器中的错误消息,但会产生完全不同的含义。

我建议你获得一个更新的ASN.1编译器,它支持2008版的ASN.1。你可以在http://www.itu.int/ITU-T/asn1/links/index.htm找到ASN.1工具列表(一些免费的,一些商业的)。

Paul

+0

谢谢保罗。在你提供的链接上,我可以看到只有OSS Noklava编译器支持2008版ASN.1,但不幸的是它不是免费的解决方案。如果我想使用Bouncycastle的api库并手动编写我的Java类。如何处理CLASS。你说它不能用SEQUENCE改变,我认为它与SET等是一样的。感谢提前。 – nick79 2012-01-28 14:44:39

+0

你说得对,OSS Nokalva编译器不是免费的,但你可以下载一个免费试用版,看看它是否适用于你,然后再支付。 CLASS的目的是存储用于确定消息内容的本地信息。 CLASS对象永远不会通过线路发送。如果你想用一个较旧的编译器做事,你可以消除CLASS定义。但是,您必须编写代码来手动处理引用该类的CLASS或信息对象的任何约束。 – 2012-01-30 16:21:43