簡體   English   中英

如何從asn1編碼數據中解碼多個字節標簽

[英]How to decode multiple byte tags from asn1 encoded data

情況如下所示,我有一個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)))
     )

那么,如何來表示TYPEID 9F1F使用pyasn1?

我可以按照以下安排解碼您的基板:

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

也就是說,它看起來像是兩個項目的串聯,而不是類似記錄的結構。

您的代碼按原樣為我工作。 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版本。 請澄清到底是什么與預期不符?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM