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 по декодерам.
Чтобы передать грамматику ASN.1 в декодер pyasn1, сначала нужно превратить грамматику в дерево объектов pyasn1/Python. Это разовая операция, которая иногда может быть автоматизирована с помощью инструмента asn1late.
Другая моя проблема в том, что вы, возможно, читаете часть ваших сериализованных данных (5 октетов). Это может быть допустимой операцией, если ваши данные были сериализованы с использованием "режима кодирования неопределенной длины", в противном случае декодер может дать сбой при недостаточном вводе.