Я пишу Основные правила кодирования кодек в D, и я хочу закодировать EmbeddedPDV, который определен в соответствии с приведенным ниже ASN.1. Проблема в том, что при кодировании identification
я не знаю, как в двоичном коде с кодировкой BER ясно указать, что я предоставляю OBJECT IDENTIFIER
, связанный с полем syntax
, а не связанный с полем transfer-syntax
.
EmbeddedPDV ::= [UNIVERSAL 11] IMPLICIT SEQUENCE {
identification CHOICE {
syntaxes SEQUENCE {
abstract OBJECT IDENTIFIER,
transfer OBJECT IDENTIFIER },
syntax OBJECT IDENTIFIER,
presentation-context-id INTEGER,
context-negotiation SEQUENCE {
presentation-context-id INTEGER,
transfer-syntax OBJECT IDENTIFIER },
transfer-syntax OBJECT IDENTIFIER,
fixed NULL },
data-value-descriptor ObjectDescriptor OPTIONAL,
data-value OCTET STRING }
(WITH COMPONENTS { ... , data-value-descriptor ABSENT })
Я знаю, что если вы используете явные теги, то для syntax
и transfer-syntax
будут контекстно-зависимые теги идентификаторов, но отсутствие, скажем, [0]
или [1]
перед syntax
и transfer-syntax
соответственно делает неясным, как я должен кодировать это. С этими полями связан предполагаемый контекстно-зависимый идентификатор? Другими словами, должен ли я кодировать OBJECT IDENTIFIER
с тегом идентификатора 0x81
, чтобы обозначить, что я кодирую syntax
, и тегом идентификатора 0x82
, чтобы обозначить, что я кодирую transfer-syntax
?