博客專欄

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

ubuntu安裝asn1c編譯器

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

最近在搞一個分布式控制系統(tǒng),所有控制器通過以太網(wǎng)鏈接,考慮到系統(tǒng)的方便擴展(將來可能有不同平臺的控制器接入到控制網(wǎng)絡(luò))以及網(wǎng)絡(luò)傳輸?shù)陌踩裕瑢νㄓ崈?nèi)容分進(jìn)行asn.1編碼。這里做一個筆記以便以后偷懶。

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

        1、下載asn1c的源碼(http://lionet.info/asn1c/download.html或者h(yuǎn)ttps://github.com/vlm/asn1c)

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

        3、進(jìn)入源碼目錄:cd asn1c-0.9.27/

        4、配置:./configure

        5、編譯:make

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

        至此安裝結(jié)束,可以用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進(jìn)行編譯:asn1c -fnative-types rectangle.asn1    ,執(zhí)行完畢后會在該目錄下生成跟編碼相關(guān)的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會打印如下內(nèi)容:

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

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

轉(zhuǎn)載于:https://my.oschina.net/Cw6PKk/blog/749153


*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



關(guān)鍵詞: asn1c

技術(shù)專區(qū)

關(guān)閉