3

私のデータは次のようにフェッチできるはずです..

構造例:-

    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

この特定の形式でエンコードされたデータ (bytearray) をデコードするにはどうすればよいですか?

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

2 に答える 2

0

これらすべてのデータ構造の正式な ASN.1 文法をお持ちの場合は、ここで公開していただけると助かります。

あなたの一般的なアプローチは正しいように見えますが、ASN.1 タグ付けの方法は疑わしいものです。

文法の最初の説明から、pyasn1 を呼び出すことで bytearray をデコードできるように見えます。

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

たとえば、ListOfVolumes() クラス インスタンスを最上位のプロトタイプ オブジェクトとしてデコーダに渡します。失敗した場合は、タグ付けが正しくないことが原因である可能性があります。

より深く掘り下げるには、pyasn1 デバッグを有効にすると役立つ場合があります。

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

bytearray から読み取られたタグと、仕様のどのオブジェクトがそれらに一致するかを確認します。

于 2012-12-04T20:45:01.830 に答える
0

エンコーディングに有効な SEQUENCE OF 項目が含まれていて、それに応じて pyasn1 データ構造を定義した場合、pyasn1 デコーダーはすべての SEQUENCE OF インスタンスをすべて単独でループできるはずです。

データ構造の pyasn1 仕様を投稿できますか?

于 2012-12-03T17:57:10.990 に答える