2012-12-03 46 views
2

我的数据应该能像下面的方式来获取..如何使用pyasn1解码ASN1编码的数据(嵌套结构化数据)?

示例结构: -

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结构, 内的单个序列,但它是非常难我遍历数据超过一次,任何一个可以请 建议我一个更好的方法理清这个问题?任何的建议是有价值的,我.. Thaks提前..
示例代码:

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

回答

0

如果编码包含一个有效序列OF项目,并相应地定义了pyasn1数据结构,pyasn1解码器应该能够遍历所有SEQUENCE OF实例。

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

+0

我已更新我的查询与试图解码它的示例代码。你可以请参考它,让我知道哪里出错了?提前致谢.. – Nishad

0

如果您对所有这些数据结构都有正式的ASN.1语法,如果您在这里发布它,这将会很有帮助。

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

从你的语法的最初描述,它看起来像你应该能够在您的字节组解码通过调用pyasn1:

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

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

要深入挖掘它可能有助于使pyasn1调试:

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

,看看标签从阅读的ByteArray什么,什么从规范对象匹配。