Skip to main content
 首页 » 编程设计

python之如何使用 pyasn1 解码 ASN1 编码数据(嵌套结构化数据)

2025年05月04日7TianFang

我的数据应该能够像下面这样获取..

示例结构:-

    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, 但是我很难多次遍历数据,请问有谁可以吗? 建议我一个更好的方法来解决这个问题?任何建议对我都很有值(value).. 提前致谢..
示例代码:

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') 

请您参考如下方法:

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

您可以发布您的数据结构的 pyasn1 规范吗?