asn.1记录学习

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

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值