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 октетов). Это может быть допустимой операцией, если ваши данные были сериализованы с использованием "режима кодирования неопределенной длины", в противном случае декодер может дать сбой при недостаточном вводе.

Другие вопросы по тегам