【发布时间】:2016-09-09 17:31:15
【问题描述】:
我需要使用 python 解码 ASN1 消息。我查看了 pyasn1 库,但它不支持 UPER。我可以用什么在 python 中解码 ASN1 UPER
【问题讨论】:
我需要使用 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 数据从/到 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 中以一种或另一种方式调用这些代码。它不会那么整洁,但总比没有好。
注意此编译器受限于它将编译的架构(它需要对数组等进行大小限制,可能最终得到静态大小的对象)。
您最好的选择可能是调用由其他 ASN.1 编译器生成的 C、C++ 或 Java 或 C# 代码 - Objective Systems 和 OSS Nokalva 上有商业代码。
==又一次编辑==
This page 谈论 Python、ASN.1 uPER。
==Encore un Edit==
PyASN1 页面指的是asn1ate,它是 Python 的代码生成器。据报道,它是“alpha 质量”,但对于简单的模式,它可能就足够了。这当然值得一看。
【讨论】:
Python 包asn1tools 实现了未对齐打包编码规则 (UPER)。它支持大多数 ASN.1 类型及其约束。
下面是一个示例,说明如何使用该包编译一个名为foo.asn 的规范,然后使用它对 Question 类型进行编码和解码:
>>> 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}
>>>
【讨论】: