1

状況は次のようなものです。BERエンコードされた(16進数の)ファイルがあり、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)))
     )

9F1Fでは、pyasn1を使用するtypeIDをどのように表現するのでしょうか。

4

2 に答える 2

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

つまり、レコードのような構造ではなく、2 つの項目を連結したように見えます。

于 2012-11-24T09:28:40.657 に答える
0

あなたのコードはそのまま私のために働きます。9F 1F タグは大きすぎて 1 つのオクテットに収まらないため、2 つのオクテットにエンコードされます。これは 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

here から取得した最新のpyasn1バージョンを使用しています。何が期待どおりに機能しないのかを明確にしてください。

于 2012-11-22T16:05:04.043 に答える