如何在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
相关产品推荐
相关产品推荐

