ASN.1 -- 使用asn1c完成ASN encode/decode

asn1c官网:http://lionet.info/asn1c/blog/
asn1c源代码:https://github.com/vlm/asn1c

一. 下载asn1c并编译生成可执行文件(关掉交叉编译)

  • 下载asn1c (此版本为主线版本asn1c-0.9.29,非release版本)
git clone https://github.com/vlm/asn1c.git

在这里插入图片描述

  • 进入下载好的代码asn1c下,执行以下命令编译源代码(可参考INSTALL.md)
test -f configure || autoreconf -iv
sudo ./configure
sudo make
make install
  • 执行完以上命令之后,可以使用man asn1c查看命令
    在这里插入图片描述

二. 使用asn1c命令将.asn文件生成.c和.h文件

  • 准备*.asn文件

  • 新建目录,将*.asn文件拷贝至./asn下
    在这里插入图片描述

  • 在./下创建out文件夹

v2x@ubuntu:~/ASN/parser$ tree
.
├── asn
│   ├── MsgFrame.asn
│   ├── ***.asn
└── out

MsgFrame.asn如下所示:

MessageFrame ::= CHOICE {
    
		bsmFrame BasicSafetyMessage,
		mapFrame MapData,
		rsmFrame RoadsideSafetyMessage,
		spatFrame SPAT,
		rsiFrame RoadSideInformation,
		...
	}
  • 在./执行以下命令,会在out中生成.c和.h文件
    默认生成带UPER编解码的版本
asn1c asn/*.asn -D out/ -gen-autotools -no-gen-example
  • 如果想要编译带例子的版本(正式代码中不需要,如果想自己测试可以使用)
asn1c asn/*.asn -D out/ -gen-autotools

之后会在./生成configure.ac Makefile.am
生成configuare文件

sudo autoreconf --force --install
sudo autoconf -i

编译例子

mkdir build
sudo ./configure --prefix=$(pwd)/build
sudo make install

会在./build下生成可执行文件和链接库

三.生成libasncodec.so(开启交叉编译)

  • 将out/下的*.c 和 *.h 分别拷贝到自己的代码中,编译成libasncodec.so
    在这里插入图片描述
    在这里插入图片描述

四.开启asn1c生成的代码中的debug log

  • 在编译libasncodec.so时,定义“-DEMIT_ASN_DEBUG=1”,CMakeLists.txt示例如下所示:
    在这里插入图片描述
    源代码中ASN_DEBUG的定义如下所示:
    在这里插入图片描述

五.encode示例

//asn1c通过MsgFrame.asn自动生成
/* MessageFrame */
typedef struct MessageFrame {
   
	MessageFrame_PR present;
	union MessageFrame_u {
   
		BasicSafetyMessage_t	 bsmFrame;
		MapData_t	 mapFrame;
		RoadsideSafetyMessage_t	 rsmFrame;
		SPAT_t	 spatFrame;
		RoadSideInformation_t	 rsiFrame;
		PrivateMsg_t	 pmFrame;
		RTCMcorrections_t	 rtcmFrame<
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值