如何从asn1编码的数据中解码多字节标签

2024-06-23 20:12:07 发布

您现在位置:Python中文网/ 问答频道 /正文

情况如下所示, 我有一个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?在


Tags: 数据标记编码规则tag情况解码univ
2条回答

我可以用以下方法解码你的底片:

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

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

你的代码对我来说就是这样。9f1f标记看起来太大了,无法容纳一个八位字节,因此它编码为两个。因为它是一个隐式标记,它取代了原来的标记。除此之外,我看不出它有什么特别之处。在

总之,这是我的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。请澄清到底什么不起作用?在

相关问题 更多 >

    热门问题