https://github.com/vlm/asn1c
asn.1好像没有开源特别好的,通过vlm/asn1c的简单学习下asn.1
一、配置安装
简易安v0.9.29,比v0.9.28多了好多选项
sudo autoreconf -iv
sudo ./configure
sudo make
sudo make install
[root@localhost asn1c]# asn1c -v
ASN.1 Compiler, v0.9.29
Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info> and contributors.
安了这些东西,记下方便卸载
/usr/local/bin/asn1c
/usr/local/share/asn1c
/usr/local/share/doc/asn1c
/usr/local/share/man/man1/asn1c.1
搜一下还可以看到openssl、mbedtls、mysql还有kernels…里都有asn的身影
二、跑个例子
1、写个asn格式的文件
定义好我们的类,放个文件夹里
执行asn1c -no-gen-OER -no-gen-example *.asn
,生成一大堆.h和.c
[root@localhost asn]# ls
rectangle.asn test.asn
[root@localhost asn]# asn1c -no-gen-OER -no-gen-example *.asn
Compiled Rectangle.c
Compiled Rectangle.h
Compiled TennisMatch.c
Compiled TennisMatch.h
Copied /usr/local/share/asn1c/OPEN_TYPE.h -> OPEN_TYPE.h
...
Copied /usr/local/share/asn1c/per_opentype.c -> per_opentype.c
Generated Makefile.am.libasncodec
[root@localhost asn]#
这个库有文档,里面有些例子,可以对照
2、编解码例子:
// 假装有例子(还没仔细研究,怕例子有错误,就先不贴了,研究好了再贴)
3、运行结果:
4、注意事项
使用g++编译需要注意几点:
1、c++一些指针需要显示的转换一下
CMakelists.txt里
2、PROJECT (“protobuf_test”) 不要加CXX,不然生成头文件里就算extern C了也还会链接错误
3、add_compile_options(-std=c++11 -DASN_DISABLE_OER_SUPPORT)
总之,总算是跑起来了,编解码也没什么问题的样子,现就这样
三、asn.1 vs protobuf
asn.1跟protobuf相比,感觉复杂许多
一个不靠谱的测试结果
protobuf
syntax = "proto3";
package myProto;
// proto3
import "google/protobuf/wrappers.proto";
message my_interface{
oneof ob{
Person person = 1;
BuiltInBool built_in_bool = 2;
GooglePbBool google_pb_bool = 3;
}
}
message BuiltInBool{
bool isTrue = 1;
}
message GooglePbBool{
google.protobuf.BoolValue isTrue = 1;
}
message Person {
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
string number = 1;
PhoneType type = 2;
}
string name = 1;
int32 age = 2;
string email = 3;
repeated PhoneNumber phone = 4;
bytes code = 5;
google.protobuf.BoolValue is_male = 6;
bool is_female = 7;
}
asn
TestModule DEFINITIONS ::=
BEGIN
MyInterface ::= CHOICE {
person AsnPerson,
boolCode BOOLEAN
}
AsnPerson ::= SEQUENCE {
name OCTET STRING,
age INTEGER,
email OCTET STRING,
phone PhoneNumberList,
code OCTET STRING,
isMale BOOLEAN,
isFemale BOOLEAN
}
PhoneNumberList ::= SEQUENCE (SIZE (1..10)) OF PhoneNumber
PhoneNumber ::= SEQUENCE {
number OCTET STRING,
type ENUMERATED{mobile, home, work}
}
END
四、参考
extern "c"为何不起作用了
最近在做一个项目的时候,阴沟里翻船,遇到了这个问题,查了下c的头文件发现extern "c"已经加了,那为什么不起作用呢?
经查看,发现是cmakelists.txt的书写问题,
project (ECL CXX)
1
上边这行表示生成的工程师一个cpp工程,那么所有的文件都会按照c++文件去编译,可是我们又加入了extern "c"所以链接阶段编译器又会按照c符号去找,自然是找不到的。
————————————————
版权声明:本文为CSDN博主「奔跑的橘子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/iceboy314159/article/details/112155437