在 Python 中解码 ASN1 UPER

Decoding ASN1 UPER in Python

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

中的 ASN1 UPER

得到架构了吗?

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

该框架与您和您的需求无关。然而,作为支持 Python 代码生成和 uPER 的 ASN.1 模式编译器潜伏在它的核心某处。您最好从试用他们预构建的 VM 映像开始,该映像为您提供 linux,其中已安装所有内容:see here。您将使用它来将模式编译成 python 源代码,然后可以编码/解码 uPER 数据 from/to Python 类。另外,您也可以对 C、C++、C#、Java、ADA 执行相同的操作。

我自己并没有很生气地尝试过,但是有很多 ESA 航天器都是用它建造的,所以它可能没问题。

没有架构?

如果您没有架构,那么您将会遇到一些问题。没有模式文件就无法解码 uPER。这是因为 uPER 数据已充分打包,几乎没有留下数据结构的证据。你会不得不猜测模式可能是什么,尝试解码,看看它是否适用于你的所有数据,如果不行再试一次。

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

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

==编辑==

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

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

注意这个编译器在编译的模式上有限制(它需要对数组等进行大小限制,大概以静态大小的对象结束)。

您最好的选择可能是调用 C、C++ 或 Java 或其他 ASN.1 编译器生成的 C# 代码 - Objective Systems and OSS Nokalva 上有商业代码。

==又一次编辑==

This page 谈论 Python,ASN.1 uPER。

==Encore un Edit==

PyASN1 page refers to asn1ate,它是 Python 的代码生成器。它被报告为 'alpha quality',但对于一个简单的模式来说它可能就足够了。绝对值得一看。

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}
>>>