ASN.1 BER кодирование EmbeddedPDV
Я пишу кодек Basic Encoding Rules в 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
?
2 ответа
"Связанный тип" для EMBEDDED PDV приведен в п. 36.5 МСЭ-T X.680(2015 г.) и включает в себя "допущение и автоматическую метку среды" перед предоставлением определения. Это было сделано, чтобы избежать загромождения текста неявными тегами для каждого поля. Это означает, что внутри "идентификации" альтернативный "синтаксис" имеет неявный тег [1], а "трансфер-синтаксис" имеет неявный тег [4]. Это определение связанного типа для содержимого EMBEDDED PDV независимо от того, в каком контексте тегирования появляется "EMBEDDED PDV".
Кажется, у вас двусмысленная запись ASN.1. Единственный способ справиться с этим - явные пометки.
Если ваш модуль ASN.1 имеет AUTOMATIC
Если в определении модуля есть теги, то ваш кодировщик, вероятно, должен явно пометить все непомеченные компоненты в ASN.1 SEQUENCE, SET и CHOICE, начиная со значения тега 0.
Это автоматическое тегирование следует применять только в том случае, если в определении построенной структуры данных, которое вы пытаетесь сериализовать, уже нет компонентов с тегами.