You need to enable JavaScript to run this app. 如何在C语言中打印ASN.1 UPER消息DENM的protocolVersion字段
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中打印ASN.1 UPER消息DENM的protocolVersion字段

ASN.1 UPER消息DENM字段读取(C语言实现方案)

核心说明

你没法直接用ASN.1定义文本里的DENM.header.protocolVersion语法直接访问字段,需要先完成ASN.1到C代码的编译、UPER二进制解码两个前置步骤,之后就可以用类似的结构体层级语法访问目标字段。

具体实现步骤

  • 第一步:编译ASN.1定义
    你需要先获取DENM对应的完整ASN.1规范文件,使用asn1c编译器将ASN.1定义编译生成对应的C结构体、编解码工具代码,编译后会生成DENM.h、DENM.c以及依赖的编解码头文件和源文件。
  • 第二步:解码UPER编码的二进制消息
    调用生成的UPER解码接口,把你手里的UPER二进制消息解码为C语言可操作的DENM_t结构体实例。
  • 第三步:访问并打印protocolVersion字段
    解码完成后直接通过结构体层级访问目标字段,打印即可。

示例代码

#include <stdio.h>
#include <stdint.h>
#include <asn_application.h>
#include <DENM.h> // asn1c编译生成的DENM头文件

int main() {
    // 假设buffer存储你拿到的UPER二进制消息,buf_len是消息长度
    uint8_t buffer[] = {/* 填入你的UPER二进制数据 */};
    size_t buf_len = sizeof(buffer);

    DENM_t *denm_msg = NULL;
    asn_dec_rval_t decode_res = uper_decode(
        NULL, 
        &asn_DEF_DENM, 
        (void**)&denm_msg,
        buffer, 
        buf_len,
        0,
        0
    );

    if (decode_res.code != RC_OK) {
        fprintf(stderr, "UPER解码失败,错误码:%d\n", decode_res.code);
        return 1;
    }

    // 访问并打印protocolVersion字段
    printf("PROTOCOL VERSION: %ld\n", denm_msg->header.protocolVersion);

    // 释放解码生成的结构体内存,避免内存泄漏
    ASN_STRUCT_FREE(asn_DEF_DENM, denm_msg);
    return 0;
}

补充说明

asn1c生成的C结构体层级和你给出的ASN.1定义层级是完全对应的,除了protocolVersion之外,其他字段也可以按照同样的层级规则访问,比如要获取stationID就用denm_msg->header.stationID即可。


内容的提问来源于stack exchange,提问作者user14677223

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 20:57:02