此次是我根据博客园一位博主的心得按照他(她)的步骤一步步完成本次工作的。
如果未下载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情况):
- RetangleTest DEFINITIONS ::=BEGIN
- Rectangle ::= SEQUENCE{
- height INTEGER, -- Height of the rectangle
- width INTEGER -- Width of the rectangle
- }
- 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,并保存在工程中的源文件目录下,文件内容如下:
- #include <stdio.h>
- #include <sys/types.h>
- #include <Rectangle.h>
- char tab[8];
- /*
- * This is a custom function which writes the
- * encoded output into a global test table
- */
- static int decode_callback(const void *buffer, size_t size, void *app_key)
- {
- static int i = 0;
- memcpy(&tab[i],buffer,size);
- i += size;
- }
- int main()
- {
- Rectangle_t *rectangle; /* Type to encode */
- asn_enc_rval_t ec; /* Encoder return value */
- /* Allocate the Rectangle_t */
- rectangle = (Rectangle_t*)calloc(1, sizeof(Rectangle_t)); /* not */
- if(!rectangle) {
- perror("calloc() failed");
- exit(71); /* better, EX_OSERR */
- }
- /* Initialize the Rectangle members */
- rectangle->height = 42; /* any random value */
- rectangle->width = 23; /* any random value */
- /* Encode the Rectangle type as BER (DER) */
- ec = der_encode(&asn_DEF_Rectangle,
- rectangle, decode_callback, tab);
- if(ec.encoded == -1) {
- fprintf(stderr,
- "Could not encode Rectangle (at %s)\n",
- ec.failed_type ? ec.failed_type->name : "unknown");
- exit(65); /* better, EX_DATAERR */
- } else {
- fprintf(stderr, "Created %s with BER encoded Rectangle\n",
- "");
- }
- /* Also print the constructed Rectangle XER encoded (XML) */
- xer_fprint(stdout, &asn_DEF_Rectangle, rectangle);
- return 0;
- }
接下来右键头文件,添加-->现有项,将之前ASN1C生成好的.h文件添加进来;
右键源文件,同上,将之前ASN1C生成好的.c文件添加进来。
此时删除源文件中的converter-sample.c文件。
编译:生成-->生成解决方案。(如果编译不成功,并且控制台出现头文件找不到的情况,右键asn1_demo工程,点击属性,找到“包含目录”的路径,“编辑”-->“新行”,将包含了头文件的路径添加进去,然后重新生成解决方案即可。
下面是生成成功后的画面:
接下来在return 0行添加断点,”调试“-->”开始执行“,得到:
这是tab数组中存的数。