如何为BER解码ASN.1 schema中TS 32297头并修改适配ASNVE1的定义
IMS CDR 头部ASN.1 Schema编译报错修复方案
你遇到的编译报错是因为客户提供的ASN.1定义中使用了CODE("DEC")、CODE("LEFT")这类非标准自定义语法,这类语法是该CDR规范特有的编码提示,不属于ASN.1标准定义的语法范畴,因此标准ASN.1编译器无法识别。
语法修改规则
CODE("DEC")表示该字段为十进制编码的BCD数值,直接删除该参数,保留原有的SIZE约束,或者替换为符合标准ASN.1的数值范围约束即可。如果是自定义类型(如FilecloserReason、ReleaseIdentifierextension),需要先补充对应类型的标准ASN.1定义。CODE("LEFT")表示OCTET STRING类型字段采用左对齐(大端序)编码,属于编码规则层面的约定,不需要写入ASN.1语法定义,直接删除该参数即可。- 原定义中的IMPLICIT标记需要保证和你的编码规则(BER/DER/PER等)的标签环境匹配,如果是默认显式标签的环境,可以保留IMPLICIT声明,避免标签匹配错误。
修改后完整Schema示例
-- 先补充缺失的自定义类型定义,可根据实际规范调整枚举值或类型 FilecloserReason ::= INTEGER { normalClose(0), fileSizeLimit(1), timeLimit(2), manualClose(3) } (0..9999) -- 对应原SIZE(4) DEC的数值范围 ReleaseIdentifierextension ::= INTEGER (0..9) -- 对应原SIZE(1) DEC的数值范围 FileHeader ::= SEQUENCE { fileLength [0] INTEGER (SIZE(4)) OPTIONAL, -- 原CODE("DEC"),4字节十进制BCD headerlength [1] INTEGER (SIZE (3)) OPTIONAL, -- 原CODE("DEC"),3字节十进制BCD highreleaseIdentifier [2] OCTET STRING (SIZE (1)) OPTIONAL, -- 原CODE("LEFT"),左对齐 lowreleaseIdentifier [3] OCTET STRING (SIZE (1)) OPTIONAL, -- 原CODE("LEFT"),左对齐 fileTimestamp [4] OCTET STRING (SIZE (4)) OPTIONAL, -- 原CODE("LEFT"),左对齐 lastcdrTimestamp [5] OCTET STRING (SIZE (4)) OPTIONAL, -- 原CODE("LEFT"),左对齐 dataRecordIdentifier [6] OCTET STRING (SIZE (8)) OPTIONAL, -- 原CODE("LEFT"),左对齐 totalCdr [10] OCTET STRING (SIZE (4)) OPTIONAL, -- 原CODE("LEFT"),左对齐 filesequencenumber [11] OCTET STRING (SIZE (4)) OPTIONAL, -- 原CODE("LEFT"),左对齐 filecloserReason [12] IMPLICIT FilecloserReason OPTIONAL, -- 原SIZE(4) CODE("DEC") ipnodeaddress [13] OCTET STRING (SIZE (20)) OPTIONAL, -- 原CODE("LEFT"),左对齐 lostCdrindicator [14] OCTET STRING (SIZE (1)) OPTIONAL, -- 原CODE("LEFT"),左对齐 lengthCdrFilter [15] INTEGER (SIZE (2)) OPTIONAL, -- 原CODE("LEFT"),左对齐 cdrroutingFilter [16] OCTET STRING (SIZE (5)) OPTIONAL -- 原CODE("LEFT"),左对齐 } CDRHeader ::= SEQUENCE { cDRLength [0] INTEGER (SIZE(2)) OPTIONAL, -- 原CODE("DEC"),2字节十进制BCD releaseIdentifier [1] IMPLICIT OCTET STRING (SIZE (1)) OPTIONAL, -- 原CODE("LEFT"),左对齐,包含版本号+发布ID dataRecordIdentifier [2] IMPLICIT OCTET STRING (SIZE (1)) OPTIONAL, -- 原CODE("LEFT"),左对齐,包含记录号+TS编号 releaseIdentifierextension [3] IMPLICIT ReleaseIdentifierextension OPTIONAL -- 原SIZE(1) CODE("DEC") }
额外说明
如果你的ASN.1工具支持自定义注解,也可以把原CODE参数作为注释保留在对应字段后,方便后续维护,不会影响编译结果。如果解码后字段数值异常,可以检查大小端转换、BCD转十进制的逻辑是否和约定一致。
内容的提问来源于stack exchange,提问作者Nidhi Shukla
相关产品推荐
相关产品推荐

