使用Visual Studio 2010添加并编译asn1文件

这篇博客介绍了如何使用ASN.1C编译器将ASN.1语言编译为C代码,从而实现数据的编码和解码。首先,下载并安装asn1c编译器,然后创建一个asn1类型文件定义矩形结构,接着在命令行中编译asn1文件生成C源码。在Visual Studio 2010中创建一个空项目,将生成的头文件和源文件添加到项目中,完成编码和解码的示例代码。最后,通过调试查看解码后的数据。
摘要由CSDN通过智能技术生成

此次是我根据博客园一位博主的心得按照他(她)的步骤一步步完成本次工作的。

如果未下载asn.1编译器ASN1C,需要先下载,下面是网址:

Open Source ASN.1 Compiler: asn1c 0.9.28处下载,此处我选择了“Windows installer: asn1c-0.9.21.exe”,下载后双击安装即可。
                本文假设安装于“D:\ASN1C\asn1c-0.9.21”。

这个编译器可以将asn.1语言编译为C类型文件。

1.创建一个asn1类型文件,注意要先把文件后缀改为asn1,再打开并输入以下内容(否则之后编译时会出现bad file descripter情况):

  1. RetangleTest DEFINITIONS ::=BEGIN
  2.     Rectangle ::= SEQUENCE{
  3.         height INTEGER,        -- Height of the rectangle
  4.         width INTEGER        -- Width of the rectangle
  5.     }
  6. END

 假设该文件保存为D:\ASN1C\asn1c-0.9.21\try.asn1。

 2.打开“命令行”(win+R,输入"cmd")

     (1)进入编译器所在目录:D:+回车,然后输入:cd D:\ASN1C\asn1c-0.9.21+回车(cd表示进入目录);

     (2)开始对try.asn1编译:asn1c -S skeletons -fskeletons-copy -fnative-types try.asn1+回车enter,其中(-S表示skeletons,可以理解为标识);

     (3)如果执行成功,会出现以下界面:

并且asn1c-0.9.21文件夹中会生成.c和.h文件:

 这些文件会在后面用到。

3.打开VS2010,创建一个新的项目,命名为asn1_demo

 

 

注意:选择空项目。

新建一个 .c文件,作为main.c,并保存在工程中的源文件目录下,文件内容如下:

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <Rectangle.h>
  4. char tab[8];
  5. /*
  6. * This is a custom function which writes the
  7. * encoded output into a global test table
  8. */
  9. static int decode_callback(const void *buffer, size_t size, void *app_key)
  10. {
  11.     static int i = 0;
  12.     
  13.     memcpy(&tab[i],buffer,size);
  14.     i += size;
  15. }
  16. int main()
  17. {
  18.     Rectangle_t *rectangle; /* Type to encode */
  19.     asn_enc_rval_t ec; /* Encoder return value */
  20.     /* Allocate the Rectangle_t */
  21.     rectangle = (Rectangle_t*)calloc(1, sizeof(Rectangle_t)); /* not */
  22.     if(!rectangle) {
  23.         perror("calloc() failed");
  24.         exit(71); /* better, EX_OSERR */
  25.     }
  26.     /* Initialize the Rectangle members */
  27.     rectangle->height = 42; /* any random value */
  28.     rectangle->width = 23; /* any random value */
  29.     /* Encode the Rectangle type as BER (DER) */
  30.     ec = der_encode(&asn_DEF_Rectangle,
  31.         rectangle, decode_callback, tab);
  32.     if(ec.encoded == -1) {
  33.         fprintf(stderr,
  34.             "Could not encode Rectangle (at %s)\n",
  35.             ec.failed_type ? ec.failed_type->name : "unknown");
  36.         exit(65); /* better, EX_DATAERR */
  37.     } else {
  38.         fprintf(stderr, "Created %s with BER encoded Rectangle\n",
  39.             "");
  40.     }
  41.     /* Also print the constructed Rectangle XER encoded (XML) */
  42.     xer_fprint(stdout, &asn_DEF_Rectangle, rectangle);
  43.     return 0;
  44. }

接下来右键头文件,添加-->现有项,将之前ASN1C生成好的.h文件添加进来;

右键源文件,同上,将之前ASN1C生成好的.c文件添加进来。

此时删除源文件中的converter-sample.c文件。

编译:生成-->生成解决方案。(如果编译不成功,并且控制台出现头文件找不到的情况,右键asn1_demo工程,点击属性,找到“包含目录”的路径,“编辑”-->“新行”,将包含了头文件的路径添加进去,然后重新生成解决方案即可。

下面是生成成功后的画面:

  

接下来在return 0行添加断点,”调试“-->”开始执行“,得到:

 

 这是tab数组中存的数。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值