博客專欄

        EEPW首頁 > 博客 > ubuntu安裝asn1c編譯器

        ubuntu安裝asn1c編譯器

        發布人:電子禪石 時間:2022-03-05 來源:工程師 發布文章

        最近在搞一個分布式控制系統,所有控制器通過以太網鏈接,考慮到系統的方便擴展(將來可能有不同平臺的控制器接入到控制網絡)以及網絡傳輸的安全性,對通訊內容分進行asn.1編碼。這里做一個筆記以便以后偷懶。

                首先是安裝asn.1編譯器,目前的編譯器有好幾種,這里選用了免費開源的asn1c編譯器(http://lionet.info/asn1c/basics.html),步驟如下:

                1、下載asn1c的源碼(http://lionet.info/asn1c/download.html或者https://github.com/vlm/asn1c)

                2、解壓源碼:tar -zxvf asn1c-0.9.27.tar.gz

                3、進入源碼目錄:cd asn1c-0.9.27/

                4、配置:./configure

                5、編譯:make

                6、安裝:sudo make install(注意需要管理員權限)

                至此安裝結束,可以用asn1c命令做一下測試,接下來做一個例子,例子見使用說明文檔

                1、新建一個rectangle.asn1文件并編輯如下文本:

        RectangleTest DEFINITIONS ::=
        BEGIN
         
        Rectangle ::= SEQUENCE {
          height INTEGER, -- Height of the rectangle
          width INTEGER -- Width of the rectangle
        }
         
        END


                  2、對rectangle.asn1進行編譯:asn1c -fnative-types rectangle.asn1    ,執行完畢后會在該目錄下生成跟編碼相關的c語言文件
           

                  3、使用eclipse新建一個c工程并將上一步生成的c文件加入到工程中,新建一個main.c,編輯如下代碼

        #include <stdio.h>#include <sys/types.h>#include <Rectangle.h> /* Rectangle ASN.1 type *//* * This is a custom function which writes the * encoded output into some FILE stream. */static int write_out(const void *buffer, size_t size, void *app_key){	FILE *out_fp = app_key;	size_t wrote;	wrote = fwrite(buffer, 1, size, out_fp);	return (wrote == size) ? 0 : -1;}int main(int ac, char **av){	Rectangle_t *rectangle; /* Type to encode */	asn_enc_rval_t ec; /* Encoder return value */	/* Allocate the Rectangle_t */	rectangle = calloc(1, sizeof(Rectangle_t)); /* not malloc! */	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 */	/* BER encode the data if filename is given */	if (ac < 2)	{		fprintf(stderr, "Specify filename for BER output\n");	}	else	{		const char *filename = av[1];		FILE *fp = fopen(filename, "wb"); /* for BER output */		if (!fp)		{			perror(filename);			exit(71); /* better, EX_OSERR */		}		/* Encode the Rectangle type as BER (DER) */		ec = der_encode(&asn_DEF_Rectangle, rectangle, write_out, fp);		fclose(fp);		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",					filename);		}	}	/* Also print the constructed Rectangle XER encoded (XML) */	xer_fprint(stdout, &asn_DEF_Rectangle, rectangle);	return 0; /* Encoding finished successfully */}

                    4、將編碼文件夾中的converter-sample.c文件刪除

                    5、編譯運行,Console會打印如下內容:

        Specify filename for BER output<Rectangle><height>42</height><width>23</width></Rectangle>

                    如果需要在arm平臺運行的話,直接將工程中的編譯器換成交叉編譯器即可

        轉載于:https://my.oschina.net/Cw6PKk/blog/749153


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: asn1c

        技術專區

        關閉
        主站蜘蛛池模板: 航空| 安国市| 阿克苏市| 镇赉县| 磐石市| 香河县| 赤壁市| 伊宁市| 财经| 七台河市| 确山县| 邵东县| 玛曲县| 翁牛特旗| 灌阳县| 遵义县| 邻水| 新兴县| 罗江县| 理塘县| 金塔县| 宝坻区| 思茅市| 益阳市| 淮北市| 塘沽区| 琼海市| 长春市| 芒康县| 青岛市| 吉木萨尔县| 改则县| 莱阳市| 子长县| 石城县| 普定县| 东丽区| 宁安市| 义马市| 娄底市| 高碑店市|