如何在一个asn.1文件中支持两个版本的结构定义

时间:2013-08-01 09:11:34

标签: asn.1

在asn.1源文件中定义一个结构时遇到问题(例如test.asn1)。

协议版本1的定义如下:

PolicyControlDiagnostics ::= ENUMERATED
{
    policy    (1),
    policyControl  (2),
    policyControlResumed    (3)
}

然后我们要求支持版本2.在协议版本2中,一些字段已更改但结构名称保持不变。例如,变量策略更改为mytestpolicy,policyControl更改为mytestpolicyControl。同时,结构名称PolicyControlDiagnostics在版本1和版本2中都是相同的。

PolicyControlDiagnostics ::= ENUMERATED
{
    mytestpolicy  (1),
    mytestpolicyControl  (2),
    policyControlResumed    (3)
}

当我尝试为BER编码生成C例程时,解码使用snac,它抱怨:

file "test.asn1", line 632: ERROR - type PolicyControlDiagnostics is multiply defined.

你能帮我解决一下这个错误吗?感谢。

2 个答案:

答案 0 :(得分:2)

如果您尝试在同一ASN.1模块中使用相同的枚举名称,则不允许这样做。如果您有两个单独的ASN.1模块,这些模块是同一规范的不同版本,每个模块都有一些具有相同名称的类型,则某些ASN.1编译器会自动为您消除冲突名称的歧义。

不允许在同一个ASN.1模块中使用两次相同的类型名称,但允许使用两个版本的模块(它们之间存在一些差异)。这两个模块之间的向后兼容性需要ASN.1专家的指导,以避免互操作性问题。

尝试ASN.1规范以查看有效内容的好地方是http://asn1-playground.oss.com上的免费在线编译器和运行时。

答案 1 :(得分:0)

错误说明了一切。您不能为类型定义两个。可以更改ENUMERATED中使用的名称,而不会影响BER编码(XER编码可能会受到影响;我必须查看它)。因此,这两个定义是等价的,你可以选择一个。