1

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

它对协议版本 1 具有以下定义:

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

然后我们需要支持版本 2。在协议版本 2 中,一些字段发生了变化,但结构名称保持不变。例如,变量 policy 更改为mytestpolicy,policyControl 更改为mytestpolicyControlPolicyControlDiagnostics同时,版本 1 和版本 2 中的结构名称相同。

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

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

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

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

4

2 回答 2

2

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

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

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

于 2013-08-01T18:11:08.337 回答
0

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

于 2013-08-01T16:36:37.757 回答