You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 10:45:04