如何从asn1编码数据中解码多个字节标记

时间:2012-11-22 13:42:32

标签: python asn.1

情况类似如下, 我有一个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?

2 个答案:

答案 0 :(得分: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()

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

答案 1 :(得分:0)

您的代码按原样为我工作。 9F 1F标签看起来太大而无法放入单个八位字节,因此它编码为两个。由于它是一个IMPLICIT标签,它取代了原始标签。除此之外,我没有看到任何特别之处。

无论如何,这是我的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

我正在使用最新的pyasn1版本from here。请澄清究竟什么不能按预期工作?