在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.
你能帮我解决一下这个错误吗?感谢。
答案 0 :(得分:2)
如果您尝试在同一ASN.1模块中使用相同的枚举名称,则不允许这样做。如果您有两个单独的ASN.1模块,这些模块是同一规范的不同版本,每个模块都有一些具有相同名称的类型,则某些ASN.1编译器会自动为您消除冲突名称的歧义。
不允许在同一个ASN.1模块中使用两次相同的类型名称,但允许使用两个版本的模块(它们之间存在一些差异)。这两个模块之间的向后兼容性需要ASN.1专家的指导,以避免互操作性问题。
尝试ASN.1规范以查看有效内容的好地方是http://asn1-playground.oss.com上的免费在线编译器和运行时。
答案 1 :(得分:0)
错误说明了一切。您不能为类型定义两个。可以更改ENUMERATED中使用的名称,而不会影响BER编码(XER编码可能会受到影响;我必须查看它)。因此,这两个定义是等价的,你可以选择一个。