在Python中解码ASN1 UPER

时间:2016-09-09 17:31:15

标签: python decode asn.1

我需要使用python解码ASN1消息。我查看了pyasn1库,但它不支持UPER。我可以用什么来解码python中的ASN1 UPER

2 个答案:

答案 0 :(得分:1)

有架构吗?

假设您拥有针对您尝试解码的数据的ASN.1架构,您可以先查看TASTE framework from the European Space Agency。这是一个基于ASN.1的航天器系统的大型应用程序开发框架。

框架与您和您的需求无关。但是,潜伏在其核心的某个地方作为支持Python代码生成和uPER的ASN.1模式编译器。您最好先尝试一下预先构建的VM映像,它会为您提供已安装所有内容的Linux:see here。您可以使用它将模式编译为python源代码,然后可以从/向Python类编码/解码uPER数据。另外,您也可以对C,C ++,C#,Java,ADA执行相同的操作。

我自己并没有多大的努力尝试过,但是很多ESA太空飞船都是用它来建造的,所以它可能都没问题。

没有架构?

如果你没有架构,那么你就会遇到一些问题。没有模式文件,uPER​​无法解码。这是因为uPER数据足够紧凑,几乎没有数据结构的证据。您可以减少猜测架构可能是什么,尝试解码,查看它是否适用于您的所有数据,如果没有,请再试一次。

如果已知它是Cannonical PER编码,那么您可以在没有架构的情况下对其进行解码,但这仍然需要付出很多努力。

这与BER编码数据形成鲜明对比,BER编码数据通过合并每个编码PDU字段的标签,类型和值信息确实保留了数据结构的细节。但是,BER编码数据远远大于PER,因此它不会用于无线电系统或其他带宽受限的传输信道。

== EDIT ==

刚刚在TASTE看了一下我现在还不确定它是否确实生成了Python代码。 Python是框架的依赖项,但它并没有声称它生成Python代码的任何地方。看起来它只是C / C ++或ADA。

无论如何,ASN.1编译器似乎已经结束了here on GITHUB。这将生成C代码(和ADA,哇!),您可以通过这种或那种方式从Python调用。它'不会变得整洁,但总比没有好。

注意这个编译器在它将编译的模式中受到限制(它需要对数组等进行大小限制,可能最终会使用静态大小的对象)。

您最好的选择可能是调用其他ASN.1编译器生成的C,C ++或Java或C#代码 - 在Objective SystemsOSS Nokalva处有商业代码。

==又一个编辑==

This page谈论Python,ASN.1 uPER。

== Encore un Edit ==

PyASN1页面引用asn1ate,它是Python的代码生成器。据报道它是“alpha质量”,但对于简单的模式,它可能就足够了。这当然值得一看。

答案 1 :(得分:1)

Python包asn1tools实现了未对齐的压缩编码规则(UPER)。它支持大多数ASN.1类型及其约束。

下面是如何使用该包编译名为foo.asn的规范,然后使用它来编码和解码问题类型的示例:

>>> import asn1tools
>>> foo = asn1tools.compile_file('tests/files/foo.asn', 'uper')
>>> encoded = foo.encode('Question', {'id': 1, 'question': 'Is 1+1=3?'})
>>> encoded
bytearray(b'\x01\x01\t\x93\xcd\x03\x15l^\xb3~')
>>> foo.decode('Question', encoded)
{'question': u'Is 1+1=3?', 'id': 1}
>>>