EmbeddedPDV的ASN.1 BER编码
ASN.1 BER Encoding of EmbeddedPDV
我正在用D写一个Basic Encoding Rules编解码器,我想编码一个EmbeddedPDV,它是根据下面的ASN.1定义的。问题是,在编码 identification
时,我不知道如何在 BER 编码的二进制文件中明确表示我提供了与 syntax
字段关联的 OBJECT IDENTIFIER
而不是到与 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
之前分别使我不清楚我应该如何对其进行编码。是否有与这些字段关联的 assumed 上下文特定标识符?换句话说,我是否应该使用 0x81
标识符标记编码 OBJECT IDENTIFIER
以指定我正在编码 syntax
和 0x82
标识符标记以指定我正在编码transfer-syntax
?
您的 ASN.1 表示法似乎不明确。我能想到的唯一处理方法是显式标记。
如果您的 ASN.1 模块在模块定义中具有 AUTOMATIC
标记子句,那么您的编码器可能应该从标记值 0 开始显式标记 ASN.1 SEQUENCE、SET 和 CHOICE 中所有未标记的组件。
只有当您尝试序列化的构造数据结构定义中没有已标记的组件时,才应应用自动标记。
这里是.
ITU-T X.680(2015) 第 36.5 条中给出了 EMBEDDED PDV 的 "associated type",并在给出定义之前包含了 "assuming and automatic tagging environment"。这样做是为了避免每个字段的隐式标记使文本混乱。这意味着在 "identification" 中,替代项 "syntax" 具有隐式标记 [1],而 "transfer-syntax" 具有隐式标记 [4]。这是 EMBEDDED PDV 内容的关联类型的定义,无论 "EMBEDDED PDV" 出现在什么标记上下文中。
我正在用D写一个Basic Encoding Rules编解码器,我想编码一个EmbeddedPDV,它是根据下面的ASN.1定义的。问题是,在编码 identification
时,我不知道如何在 BER 编码的二进制文件中明确表示我提供了与 syntax
字段关联的 OBJECT IDENTIFIER
而不是到与 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
之前分别使我不清楚我应该如何对其进行编码。是否有与这些字段关联的 assumed 上下文特定标识符?换句话说,我是否应该使用 0x81
标识符标记编码 OBJECT IDENTIFIER
以指定我正在编码 syntax
和 0x82
标识符标记以指定我正在编码transfer-syntax
?
您的 ASN.1 表示法似乎不明确。我能想到的唯一处理方法是显式标记。
如果您的 ASN.1 模块在模块定义中具有 AUTOMATIC
标记子句,那么您的编码器可能应该从标记值 0 开始显式标记 ASN.1 SEQUENCE、SET 和 CHOICE 中所有未标记的组件。
只有当您尝试序列化的构造数据结构定义中没有已标记的组件时,才应应用自动标记。
这里是
ITU-T X.680(2015) 第 36.5 条中给出了 EMBEDDED PDV 的 "associated type",并在给出定义之前包含了 "assuming and automatic tagging environment"。这样做是为了避免每个字段的隐式标记使文本混乱。这意味着在 "identification" 中,替代项 "syntax" 具有隐式标记 [1],而 "transfer-syntax" 具有隐式标记 [4]。这是 EMBEDDED PDV 内容的关联类型的定义,无论 "EMBEDDED PDV" 出现在什么标记上下文中。