c - der_encode()编码ASN1消息失败.处理步骤



我在https://github.com/vlm/asn1使用开源ASN1编译器,当我试图编码我的消息时,我遇到了一个问题。

我有以下TCIMsg_t类型:

typedef struct TCIMsg {
long     version;
Time64_t     time;
Frame_t  frame;
/*
* This type is extensible,
* possible extensions are below.
*/

/* Context for parsing across buffer boundaries */
asn_struct_ctx_t _asn_ctx;
} TCIMsg_t;

当我尝试用如下的der_encode()函数编码时,

TCIMsg_t* tci_msg = (TCIMsg_t *)calloc(1, sizeof(TCIMsg_t));
const char *filename = av[1];
FILE *fp = fopen(filename, "wb");
if(!fp){
perror("filename");
exit(1);
}
ec = der_encode(&asn_DEF_TCIMsg, tci_msg, write_out, fp);
// ec = oer_encode_to_buffer(&asn_DEF_TCIMsg, 0, tci_msg, buffer, sizeof(buffer));
fclose(fp);
if(ec.encoded == -1){
fprintf(stderr, "Could not encode TCIMsg (at %s)n",
ec.failed_type ? ec.failed_type -> name:"unknown");
exit(1);
} else {
fprintf(stderr, "Created %s with BER encoded Eventn", filename);
}

编码失败,我得到Could not encode TCIMsg (at Frame)消息。Frame只是另一个嵌套结构体,就像下面的

typedef struct Frame {
Frame_PR present;
union Frame_u {
TCI16093_t   d16093;
TCI80211_t   d80211;
TCI16094_t   d16094;
TCI29451_t   d29451;
TCISutControl_t  sutCtrl;
/*
* This type is extensible,
* possible extensions are below.
*/
} choice;

/* Context for parsing across buffer boundaries */
asn_struct_ctx_t _asn_ctx;
} Frame_t;

您的代码示例(如果完整的话)实际上并没有填充分配的tci_msg或包含的Frame。我不知道在模式文件中有什么定义了TCIMsg或Frame,但可能是:

  1. 您至少需要设置tci_msg->frame的值。present(我猜是表示填充Frame_u的哪个成员的字段)。感觉Frame被定义为包含一个CHOICE,编码器需要知道CHOICE是如何被填充的(在你的代码示例中没有)。
  2. 如果在。asn模式文件的任何地方有任何约束,并且未初始化的tci_msg不符合这些约束,那么编码器将正确返回一个错误。

可以从查看.asn模式文件的内容中学到更多东西!

最新更新