2016-07-11 11 views
1

私は、コードのこの小さな部分を持っている:Pyasn1どのようにdecoder.decodeが動作しますか?

from pyasn1.type import univ 
from pyasn1.codec.ber import decoder 

decoder.decode(binary_file.read(5)) 

私binary_file変数にはエンコードされた特定のバイナリファイル(CDR)です

私はreaded一部を解読しようとした場合、それは私に、このエラーを与える:

pyasn1.error.PyAsn1Error: [128:0:0]+[128:32:79] not in asn1Spec: None 

にはどうすれば解決できますか?

答えて

1

あなただけ(などINTEGER、SEQUENCEなど)、ベースASN.1タイプを含むデータ構造をデコードしていない限り、あなたはデコーダにトップレベルASN.1データ構造のオブジェクトを渡す必要があります。そのようにして、デコーダは、(BER/DER/CERシリアライゼーションのTLVタプルの)カスタムタグと、データ構造オブジェクトに存在する同じタグとを一致させることができます。例:

custom_int_type = Integer().subtype(implicitTag=Tag(tagClassContext, tagFormatSimple, 40)) 

custom_int_instance = custom_int_type.clone(12345) 
serialization = encode(custom_int_instance) 

# this will fail on unknown custom ASN.1 type tag 
custom_int_instance, rest_of_serialization = decode(serialization) 

# this will succeed as custom ASN.1 type (containing tag) is provided 
custom_int_instance, rest_of_serialization = decode(serialization, asn1Spec=custom_int_type) 

ここにはpyasn1 documentation on decodersへのリンクがあります。あなたが最初のオブジェクトのpyasn1/Pythonの木にあなたの文法を有効にする必要がありpyasn1デコーダにASN.1文法を渡すために

。それは時々asn1lateツールで自動化できる1回限りの操作です。

私の他の懸念は、あなたはおそらく、あなたのシリアライズされたデータ(5つのオクテット)の一部を読んでいるということです。データが「不定長符号化モード」を使用してシリアル化された場合、有効な操作になる可能性があります。そうしないと、デコーダが不十分な入力で失敗する可能性があります。

+0

カスタム.asnファイルを使用してエンコードできますか?ちょっと 何か:decoder.decode(VAR1、asn1Spec = 'mycustomASNfile')VAR1 = binary_file.read(190)以前にファイル.asn私のカスタムの "ASNルール/構造" 次エンコードされたファイルから? (BERシリアル化)、または.asnファイルを.pyに変換する必要がありますか? はいの場合は適切な構文を教えてください。 あなたの助けを求めるthyx ^^ –

+0

.asn1ファイルをpyasn1/Pythonクラスに変換する必要があります。これは、[asn1late](https://github.com/kimgr/asn1ate)ツールで処理できる1回限りの操作です。 –

関連する問題