ParseError:第1行第1列的ASN.1语法无效:'>!<“':预期的模块引用

时间:2019-07-03 14:37:26

标签: python snmp pyasn1 asn1

我是asn1的新手,我的议程是我想将python字典转换为.asn格式。 当我运行以下代码时,出现以下错误

ParseError:第1行第1列的ASN.1语法无效:'>!<“':预期的模块引用。

from __future__ import print_function
from binascii import hexlify
import asn1tools

specification=""""
Foo DEFINITIONS ::= BEGIN

    Question ::= SEQUENCE {
        id        INTEGER,
        question  IA5String
    }

    Answer ::= SEQUENCE {
        id        INTEGER,
        answer    BOOLEAN
    }

END
""""


Foo = asn1tools.compile_string(specification, 'uper')

Question = {'id': 2, 'question': u'Hi how r u?!'}
Answer ={'id': 2, 'answer': u'Hi i am good'}
encoded = Foo.encode('Question', Question)
encoded1 = Foo.encode('Answer', Answer)
decoded = Foo.decode('Question', Question)

print('Question:', Question)
print('Encoded:', hexlify(encoded).decode('ascii'))
print('Decoded:', decoded)

2 个答案:

答案 0 :(得分:0)

您的ASN.1模式看起来正确。您可以在asn1.io上验证语法。由于错误被报告为第一个字符(第1行,第1列),因此它可能是多余的引号或准备规范时插入的其他一些字符。

答案 1 :(得分:0)

Python字符串文字不是用四个引号引起来,而是使用三个引号引起来。

从问题中突出显示的语法中可以看出这是错误的。

我的Python安装完全拒绝您的代码。当我将结束定界符固定为三个引号时(但保留开始定界符不变),我得到了您报告的问题。 (请下次发布您的代码 verbatim 。)

同时修复这两个问题时,我会收到一个新错误:

  

asn1tools.codecs.EncodeError:答案:预期为bool类型的数据,但是嗨,我很好。

这是因为您正尝试使用英语字符串(如布尔值);应该是:

Answer ={'id': 2, 'answer': True}

最后,解码失败,因为您将错误的参数传递给Foo.decode;应该是:

decoded = Foo.decode('Question', encoded)

现在可以了。


from __future__ import print_function
from binascii import hexlify
import asn1tools

specification="""
Foo DEFINITIONS ::= BEGIN

    Question ::= SEQUENCE {
        id        INTEGER,
        question  IA5String
    }

    Answer ::= SEQUENCE {
        id        INTEGER,
        answer    BOOLEAN
    }

END
"""


Foo = asn1tools.compile_string(specification, 'uper')

Question = {'id': 2, 'question': u'Hi how r u?!'}
Answer ={'id': 2, 'answer': True}
encoded = Foo.encode('Question', Question)
encoded1 = Foo.encode('Answer', Answer)
decoded = Foo.decode('Question', encoded)

print('Question:', Question)
print('Encoded:', hexlify(encoded).decode('ascii'))
print('Decoded:', decoded)