2016-07-11 23 views
1

Ich habe diesen kleinen Teil des Codes:Pyasn1 Wie funktioniert decoder.decode?

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

decoder.decode(binary_file.read(5)) 

meine binary_file Variable es eine bestimmte binäre Datei ist verschlüsselt (CDR)

wenn ich versuche, den readed Teil zu dekodieren es mir diesen Fehler gibt:

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

wie kann ich reparieren?

Antwort

1

Sofern Sie keine Datenstruktur dekodieren, die nur Basis-ASN.1-Typen enthält (wie INTEGER, SEQUENCE usw.), müssen Sie Ihr Datenstrukturobjekt der obersten Ebene ASN.1 an den Decoder übergeben. Auf diese Weise kann der Decoder benutzerdefinierte Tags (von TLV-Tupeln in BER/DER/CER-Serialisierung) mit den gleichen Tags im Datenstrukturobjekt abgleichen. Zum Beispiel:

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) 

Hier ist ein Link zu pyasn1 documentation on decoders.

Um die ASN.1-Grammatik an den pyasn1-Decoder zu übergeben, müssen Sie zuerst Ihre Grammatik in den pyasn1/Python-Baum der Objekte umwandeln. Dies ist eine einmalige Operation, die manchmal mit dem Tool asn1late automatisiert werden kann.

Meine andere Sorge ist, dass Sie möglicherweise einen Bruchteil Ihrer serialisierten Daten (5 Oktetts) lesen. Dies könnte eine gültige Operation sein, wenn Ihre Daten mit dem "unbestimmten Längencodierungsmodus" serialisiert wurden, andernfalls kann der Decodierer bei unzureichender Eingabe fehlschlagen.

+0

Kann ich eine benutzerdefinierte .asn-Datei zum Codieren verwenden? etwas irgendwie: decoder.decode (var1, asn1Spec = 'mycustomASNfile') wo var1 = binary_file.read (190) aus einer Datei, die zuvor nach den "ASN-Regeln/Struktur" meiner benutzerdefinierten .asn-Datei codiert wurde? (BER-Serialisierung) oder ich muss die .asn-Datei in ein .py übersetzen? Wenn ja, kannst du mir die richtige Syntax geben? thnx for helping ^^ –

+0

Sie müssen die .asn1-Datei in pyasn1/Python-Klassen übersetzen. Das ist eine einmalige Operation, die möglicherweise von [asn1late] (https://github.com/kimgr/asn1ate) Tool bearbeitet werden kann. –