【问题标题】:How to decode multiple byte tags from asn1 encoded data如何从 asn1 编码数据中解码多个字节标签
【发布时间】:2012-11-22 13:42:31
【问题描述】:

情况如下, 我有一个 BER 编码(十六进制)文件,我想按照 BER 解码来解码数据 规则。我能够使用 "pyasn1" 解码大多数标签,但无法使用此规则解码特殊标签,例如:9F 1F

如何解码而不出错?
提示:它是数据的“OctetString”表示。

示例代码

class MYData(univ.Set):
     tagSet = baseTagSet = tag.initTagSet(tag.Tag(tag.tagClassContext,
                                          tag.tagFormatSimple, 21))
     componentType = namedtype.NamedTypes(
         namedtype.OptionalNamedType('SampleField', univ.OctetString().subtype(
         implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 31)))
     )

那么,如何用pyasn1表示9F1F的typeID呢?

【问题讨论】:

    标签: python asn.1


    【解决方案1】:

    我可以通过以下安排解码您的基板:

    from pyasn1.type import univ, tag
    from pyasn1.codec.ber import decoder
    from pyasn1 import debug
    
    debug.setLogger(debug.Debug('all'))
    
    firstItem = univ.OctetString().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 31))
    secondItem = univ.OctetString().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 32))
    
    substrate = '\x9f\x1f\x02"\x00\x9f \x08\x01\x04\xf4\x17\x0c\xf0\x8a-'
    i1, substrate = decoder.decode(substrate, asn1Spec=firstItem)
    print i1.prettyPrint()
    
    i2, substrate = decoder.decode(substrate, asn1Spec=secondItem)
    print i2.prettyPrint()
    

    也就是说,它看起来像是两个项目的串联,而不是类似记录的结构。

    【讨论】:

    • 感谢 IIya Etingof,Pooh .... 最后我决定采用上述解决方案 ...
    【解决方案2】:

    您的代码按原样为我工作。 9F 1F 标签看起来太大而无法放入单个八位字节,因此它编码为两个。由于它是一个隐式标签,它会替换原始标签。除此之外,我看不出它有什么特别之处。

    无论如何,这是我的 Python 控制台:

    >>> class MYData(univ.Set):
    ...      tagSet = baseTagSet = tag.initTagSet(tag.Tag(tag.tagClassContext,
    ...                                           tag.tagFormatSimple, 21))
    ...      componentType = namedtype.NamedTypes(
    ...          namedtype.OptionalNamedType('SampleField', univ.OctetString().subtype(
    ...          implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 31)))
    ...      )
    >>> myData = MYData()
    >>> myData['SampleField'] = 'A'
    >>> print myData.prettyPrint()
    MYData:
     SampleField=A
    >>>
    >>> encoder.encode(myData)
    '\xb5\x04\x9f\x1f\x01A'
    >>> v, _ = decoder.decode('\xb5\x04\x9f\x1f\x01A', asn1Spec=myData)
    >>> print v.prettyPrint()
    MYData:
     SampleField=A
    

    我正在使用from here 拍摄的最新 pyasn1 版本。请澄清究竟是什么没有按预期工作?

    【讨论】:

    • 我的数据如下:
    • 我的数据如下: bytearray("\x9f\x1f\x02"\x00\x9f \x08\x01\x04\xf4\x17\x0c\xf0\x8a-") 和我需要使用单个 namedtype = 'Sample Field' 对其进行解码,如 MYdata 类中所述。那么我应该给它什么标签来以与编码相同的方式对其进行解码。注意两个标签是:“\x9f\x1f”和“ \x9f " ,请注意第二个标签后有一个空格。
    猜你喜欢
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 2021-11-27
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多