簡體   English   中英

如何使用 pyasn1 解碼 ASN1 編碼數據(嵌套結構化數據)?

[英]How to decode an ASN1 encoded data(nested structured data) using pyasn1?

我的數據應該能夠像下面這樣獲取..

示例結構:-

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

如果您的編碼包含有效的 SEQUENCE OF 項並且您相應地定義了 pyasn1 數據結構,則 pyasn1 解碼器應該能夠自己遍歷所有 SEQUENCE OF 實例。

你能發布你的數據結構的pyasn1規范嗎?

如果您擁有所有這些數據結構的正式 ASN.1 語法,那么在此處發布它會很有幫助。

你的一般方法看起來是正確的,但是你做 ASN.1 標記的方式是可疑的。

從您對語法的最初描述來看,您似乎應該能夠通過調用 pyasn1 來解碼您的字節數組:

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

例如,將 ListOfVolumes() 類實例作為頂級原型對象傳遞給解碼器。 如果失敗,可能是由於標記不正確。

要深入挖掘它可能有助於啟用 pyasn1 調試:

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

並查看從 bytearray 讀取哪些標簽以及您的規范中的哪些對象與它們匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM