非常简单的ASN1示例

时间:2014-05-09 11:59:54

标签: c++ c asn.1

我正在尝试编写一个非常简单的C程序,它通过套接字发送ASN1号码。 这是ASN.1定义

  

模块定义:: = BEGIN

  M1 ::= SEQUENCE
    {
      number INTEGER  --  integer to send
    } END

我生成了C类。现在我想我必须在主类中创建一个数字并对其进行编码并在另一侧对其进行解码。但如果我想创建一个M1对象

M1 a;
or 
M1 *a;

我收到了这个错误 M1型无法解决。

1 个答案:

答案 0 :(得分:3)

问题是您正在使用C编译器进行编译....因此必须使用完整的struct Name(或者通过typedef&#39}来引用结构名称。你已经这样做了......就像生成的代码那样。)

我使用您提供的URL粘贴了您的ASN.1模块,下载了生成的代码并尝试使用它。

请注意,生成的定义包含(在M1.h中)

#ifdef __cplusplus
extern "C" {
#endif

/* M1 */
typedef struct M1 {
    long     number;

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

/* Implementation */
extern asn_TYPE_descriptor_t asn_DEF_M1;

#ifdef __cplusplus
}
#endif

现在我尝试使用mymain.C

#include "M1.h"

int main() {
   M1 a;
   struct M1 b;
   M1_t c;
}

用g ++编译(即作为C ++程序),没有抱怨

现在,如果我使用gcc编译(相同的源代码)mymain.c,那么我得到:

x.c: In function ‘main’:
x.c:6:4: error: unknown type name ‘M1’
    M1 a;

删除该行(即不使用M1,但使用struct M1M1_t来引用类型),所有内容都可以正常编译。

总结:

  • 选择你的毒药,无论是C还是C ++
  • 如果您使用的是C ++,请使用M1M1_t(或struct M1
  • 如果您使用的是C,请使用struct M1M1_t

进行所有进出检查: