2016-07-11 5 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)

если я пытаюсь расшифровать прочтенную часть это дает мне эту ошибку:

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

как я могу исправить?

ответ

1

Если вы не декодируете структуру данных, содержащую только базовые типы ASN.1 (такие как INTEGER, SEQUENCE и т. Д.), Вам необходимо передать объект структуры данных ASN.1 верхнего уровня в декодер. Таким образом, декодер может соответствовать пользовательским тегам (из кортежей TLV в сериализации BER/DER/CER) с теми же тегами, присутствующими в объекте структуры данных. Например:

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.

Чтобы передать грамматику ASN.1 в декодер pyasn1, вы должны сначала превратить свою грамматику в pyasn1/Python дерево объектов. Это одноразовая операция, которую иногда можно автоматизировать с помощью инструмента asn1late.

Мое другое беспокойство заключается в том, что вы, возможно, читаете часть своих сериализованных данных (5 октетов). Это может быть допустимой операцией, если ваши данные были сериализованы с использованием режима неопределенного кодирования длины, иначе декодер может выйти из строя при недостаточном вводе.

+0

Могу ли я использовать пользовательский .asn-файл для кодирования? что-то вроде: decoder.decode (var1, asn1Spec = 'mycustomASNfile') где var1 = binary_file.read (190) из файла, который был предварительно закодирован в соответствии с «правилами/структурой ASN» моего пользовательского .asn-файла? (Сериализация BER), или я должен перевести файл .asn в .py? если да, вы можете дать мне правильный синтаксис? thnx для помощи ^^ –

+0

Вы должны перевести файл .asn1 в классы pyasn1/Python. Это одноразовая операция, которую можно обработать с помощью инструмента [asn1late] (https://github.com/kimgr/asn1ate). –