Кодирование и декодирование неявных тегов

У меня есть вопрос о явных и неявных тегах, в следующем примере

X ::= [APPLICATION 5] IMPLICIT INTEGER

за X, поскольку неявный тег заменит существующий тег на INTEGER с [APPLICATION 5]Таким образом, кодировка в BER значения 5 будет в шестнадцатеричном 45 01 05, Как декодер узнает тип от 45 01 05?

4 ответа

Я подозреваю, что ваш реальный вопрос: "Как может декодер BER знать, что делать, когда используются неявные теги, и эти теги заменяют теги, которые в противном случае сигнализировали бы о типе ASN.1, который необходимо декодировать?"

Способность декодера обрабатывать теги IMPLICIT зависит от того, информирован ли декодер спецификацией ASN.1, которая обеспечивает необходимый контекст. Существуют требования, предъявляемые к компонентам SEQUENCE, SET и CHOICE, чтобы гарантировать, что декодер может прочитать тег и узнать, какой компонент должен быть декодирован и, следовательно, каков тип. Это требует знания спецификации ASN.1.

Напротив, универсальный декодер BER, который не информирован спецификацией ASN.1, будет иметь проблему с неявными тегами, потому что ему не хватает необходимого контекста для их интерпретации.

Единственный способ для декодера восстановить исходный тип из потока октетов - это узнать, что он идет. AFAIK, ваш декодер должен получить подсказку о том, какой тип ожидать в данных обстоятельствах, и, что наиболее важно, о том, какой базовый тип ASN.1 будет неявно помечен для отображения типов.

Подумайте о проверке этой книги.

Обычно декодер BER генерируется компилятором ASN.1 на основе заданной спецификации (схемы). Затем во время декодирования, помимо входных закодированных данных, пользователи также будут указывать тип, который они хотят декодировать. Используя информацию о типе, декодер будет знать, что декодировать.

Во-первых, я прочитал книгу "ASN.1 Связь между гетерогенными системами", в которой меня прислал Илья Этингоф, ниже показано больше деталей:

"Маркер IMPLICIT действует следующим образом: все следующие теги, явно упоминаемые или косвенно достигаемые посредством ссылки на тип, игнорируются до следующего вхождения (включенного) тегакласса UNIVERSAL(за исключением случаев, когда маркер EXPLICIT встречался ранее). тип T ниже:

T:: = [1] ПОДРАЗУМЕВАЕМЫЙ T1

T1:: = [5]IMPLICIT T2 *

T2:: = [ПРИЛОЖЕНИЕ 0] ПОЯСНИТЕЛЬНЫЙ ИНТЕГЕР

только тег [1] должен быть закодирован. Другой способ объяснить концепцию неявного тегирования - сказать, что тег, помеченный IMPLICIT, перезаписывает тег, следующий за ним (рекурсивно); следовательно, для приведенного выше примера тег [1] перезаписывает тег [5], который, в свою очередь, перезаписывает тег [APPLICATION 0], который окончательно перезаписывает тег по умолчанию [UNIVERSAL 2] типа INTEGER.

Тип, помеченный в неявном режиме, может быть декодирован, только если принимающее приложение "знает" абстрактный синтаксис, то есть декодер был сгенерирован из того же модуля ASN.1, что и кодер (и так происходит в большинстве случаев)."

Поэтому я полагаю, что на уровне представления информации следует начать обсуждение (спецификация ASN1) в начале передачи данных.

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