情况类似如下,
我有一个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?
答案 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。请澄清究竟什么不能按预期工作?