【问题标题】:How to decode an ASN1 encoded data(nested structured data) using pyasn1?如何使用 pyasn1 解码 ASN1 编码数据(嵌套结构化数据)?
【发布时间】:2012-11-20 23:02:48
【问题描述】:

我的数据应该可以通过以下方式获取..

示例结构:-

    listOfVolumes: -> SequenceOf
         ChangeOfCharCondition -> Sequence
                dataUplink: 9612742 -> Integer   
                dataDownlink: 216449 -> Integer
                changeCondition: qoSChange (0) -> Enumerated
                Time: 1206202320082b0530 -> OctetString

         ChangeOfCharCondition -> Sequence
                qosNegotiated: 0223921f9396979774f9ffff -> OctetString
                dataUplink: 57664480 -> Integer
                dataDownlink: 1460443 -> Integer
                changeCondition: recordClosure (2) -> Enumerated
                Time: 1206210017072b0530 -> OctetString

我如何解码这种特定格式的数据编码(字节数组)?

如果它只是 SEQUENCEOF 结构中的单个 SEQUENCE,我可以对其进行解码, 但是我很难多次循环数据,请任何人都可以 建议我一个更好的方法来解决这个问题?任何建议对我来说都很有价值.. 提前谢谢 ..
示例代码:

class ChangeCondition(univ.Enumerated):

     namedValues = namedval.NamedValues(
        ('qoS', 0),
        ('Time', 1),
        ('Closure', 2),
        ('ContinueOngoing', 3),
        ('RetryandTerminateOngoing', 4),
        ('TerminateOngoing', 5),
        ('cGI', 6),
        ('rAI', 7),
        ('dT', 8),
        ('dT-Removal', 9))
        subtypeSpec = univ.Enumerated.subtypeSpec + \
                constraint.SingleValueConstraint(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

class ChangeOfCharCondition(univ.Sequence):

    componentType = namedtype.NamedTypes(
    namedtype.OptionalNamedType('Negotiated', univ.OctetString().subtype(
        implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 2))),
    namedtype.OptionalNamedType('dataUplink', univ.Integer().subtype(
        implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 3))),
    namedtype.OptionalNamedType('dataDownlink', univ.Integer().subtype(
        implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 4))),
    namedtype.NamedType('changeCondition', ChangeCondition().subtype(
        implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 5))),
    namedtype.OptionalNamedType('Time', univ.OctetString().subtype(
        implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 6)))
       )

class ListOfVolumes(univ.SequenceOf):

    tagSet = baseTagSet = tag.initTagSet(tag.Tag(tag.tagClassContext,tag.tagFormatSimple, 12),)
    componentType = ChangeOfCharCondition()

class MyCdr(univ.Set):

     tagSet = baseTagSet = tag.initTagSet(tag.Tag(tag.tagClassContext,tag.tagFormatSimple, 21))
    componentType = namedtype.NamedTypes(
    namedtype.OptionalNamedType('listOfVolumes', ListOfVolumes()))                                                    

我的数据如下,

bytearray(b'\xb5\x81\x2a\xac(0&\xa2\x0e\x81\x0c\x01#Q\x1f\x93\x96HHt\xf9\xff\xff\x83\x02\x06x\x84\x02\x13m\x85\x01\x02\x86\t6\x05"#\x12E+\x050')

【问题讨论】:

    标签: python python-2.7 asn.1


    【解决方案1】:

    如果您的编码包含有效的 SEQUENCE OF 项目,并且您相应地定义了 pyasn1 数据结构,那么 pyasn1 解码器应该能够自行循环所有 SEQUENCE OF 实例。

    您能否发布您的数据结构的 pyasn1 规范?

    【讨论】:

    • 我已经用示例代码更新了我的查询,我试图通过它来解码它。您可以参考它并让我知道哪里出错了?提前谢谢..
    【解决方案2】:

    如果您拥有所有这些数据结构的正式 ASN.1 语法,那么在此处发布它会很有帮助。

    你的一般方法看起来是正确的,但是你做 ASN.1 标记的方式是可疑的。

    从您最初对语法的描述来看,您应该能够通过调用 pyasn1 来解码您的字节数组:

    decoder.decode(mybytearray, asn1Spec=ListOfVolumes())
    

    例如将 ListOfVolumes() 类实例作为顶级原型对象传递给解码器。如果失败,可能是由于标记不正确。

    要深入挖掘,启用 pyasn1 调试可能会有所帮助:

    from pyasn1 import debug
    debug.setLogger(debug.Debug('all')
    

    并查看从 bytearray 中读取了哪些标签,以及您的规范中的哪些对象与它们匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-11
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多