ASN.1语法正确性验证及兼容改写技术咨询
关于ASN.1语法报错与改写的解答
我来帮你一步步理清这个问题:
1. 该语句是否符合2002版ASN.1标准语法?
答案是否定的。你遇到的! RejectProblem:general-unrecognizedPDU部分不是标准2002 ASN.1的语法。
在标准ASN.1 2002规范中,CONSTRAINED BY的语法定义是:
CONSTRAINED BY <constraint-specification>
这里的<constraint-specification>只能是符合ASN.1规则的约束表达式,标准里完全没有!后缀这种用法。
2. 这是不是扩展语法?
是的,这是Wireshark的asn2wrs.py工具独有的扩展语法。
asn2wrs是Wireshark团队为了适配自身协议解析需求开发的工具,这个!后缀是它用来关联ASN.1类型与Wireshark内部错误处理逻辑(比如映射到特定的RejectProblem错误码)的私有标记,不属于任何ASN.1标准规范。这也是为什么asn2wrs能处理,但严格遵循标准的asn1c会报错。
3. 能否改写为不改变生成C结构的等效语句?
完全可以!因为!后面的内容只是Wireshark特定的元数据,不影响ASN.1类型的核心结构定义,所以我们只需要把这部分内容移到标准ASN.1注释中,就能让asn1c正常解析,同时生成的C结构和原语句完全一致。
改写示例:
原报错语句:
CONSTRAINED BY { -- must conform to the above definition --} ! RejectProblem:general-unrecognizedPDU
改写后(两种可选方式):
方式1:将扩展标记移到独立注释
CONSTRAINED BY { -- must conform to the above definition -- } -- Wireshark-specific metadata: ! RejectProblem:general-unrecognizedPDU
方式2:将扩展标记嵌入原有注释块
CONSTRAINED BY { -- must conform to the above definition -- ! RejectProblem:general-unrecognizedPDU -- }
这两种改写方式都符合标准ASN.1语法,asn1c能正常解析,同时保留了原有的Wireshark相关元数据(如果之后还要用asn2wrs处理,只要注释格式能被它识别即可),生成的C代码结构和原语句完全没有区别——因为CONSTRAINED BY本身在asn1c生成代码时大多是注释性约束,不会直接影响C结构体的字段定义。
内容的提问来源于stack exchange,提问作者qwe
相关产品推荐
相关产品推荐

