【问题标题】:Decoding ASN1 UPER in Python在 Python 中解码 ASN1 UPER
【发布时间】:2016-09-09 17:31:15
【问题描述】:

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

【问题讨论】:

    标签: python decode asn.1


    【解决方案1】:

    知道架构了吗?

    假设您尝试解码的数据具有 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 SystemsOSS Nokalva 上有商业代码。

    ==又一次编辑==

    This page 谈论 Python、ASN.1 uPER。

    ==Encore un Edit==

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

    【讨论】:

    • 基本上就在这里:没有任何用于 ASN.1 的 Python 代码生成器,至少我不知道。如果你喜欢 Python,有几个可能的解决方案: (1) 生成 C# 并使用 IronPython; (2) 生成Java并使用Jython; (3)生成C/C++,使用Swig或Boost.python对生成的代码进行包装。
    • @Ethan,您使用 IronPython 生成的 C# 代码的想法可能是最简洁的方法。从那以后,我发现有一个用于 Python 的 alpha 质量代码生成器,我在对我的答案的编辑中引用了它,但 C# + IronPython 仍然是我想说的获得好结果的最有把握的方法。当然,我用于 C# 和 ASN.1 的商业工具是“合适的”。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-10
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 2015-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多