编译工具使用
编译工具asn1rs-cli,位于“/usr/local/ksl/bin”下。用户可以使用它来解析ASN.1脚本,并将ASN.1脚本转换为C语言代码的中间文件(包含多个源文件和头文件)。
在本章节的示例中,将展示如何使用编译工具asn1rs-cli将.asn文件转换为C语言源码文件。
获取帮助
执行以下命令获取命令相关帮助。
./asn1rs-cli --help
输出如下回显信息。
ASN.1 Rust Compiler 1.2.0 USAGE: asn1rs-cli [FLAGS] [OPTIONS] --input <ASN.1 文件(列表)> --method <传输语法(aper|uper|eper|ber...)> [SUBCOMMAND] FLAGS: -C, --comments 提取日志信息到抽象语法文件中 -D, --debug 打印调试信息到文件 -h, --help Prints help information -r, --intermediate 导出中间结果到文件 -V, --version Prints version information OPTIONS: --dump-types <csv文件路径> 控制台输出编译出的类型列表至csv文件 -i, --input <ASN.1 文件(列表)> 选择一个或多个 ASN.1 文本文件,如 -i s1.asn x2.asn; 也可利用通配,如 -i *.asn --merge <合并后的目录名,支持指定多级目录,如a/b/c,最终输出目录在exports/a/b/c> 合并编译,未合并情况下每个ASN.1文件将独立进行编译和输出,存在该选项则将所有输入的ASN.1文件合并生成目标文件 -m, --method <传输语法(aper|uper|eper|ber...)> 选择一个编解码规则,选中的编解码规则会应用到当前命令行的所有输入文件中 SUBCOMMANDS: cc [核心] 将 ASN.1 文件编译为 C 代码 cceos [扩展] C 后端 LTE EOS 版本 ccnr [核心] 将 ASN.1 文件编译为 CPP 代码 diff [扩展] 比对ASN.1文件的版本变更是否符合要求 help Prints this message or the help of the given subcommand(s) xmlc [核心] 将 ASN.1 文件编译为 XML 文件
子参数
该工具还有一系列子参数,例如cc子参数的帮助信息可执行以下命令查看。
./asn1rs-cli cc --help
输出如下回显信息。
asn1rs-cli-cc [核心] 将 ASN.1 文件编译为 C 代码 USAGE: asn1rs-cli --input <ASN.1 文件(列表)> --method <传输语法(aper|uper|eper|ber...)> cc [FLAGS] [OPTIONS] FLAGS: --count-like-present 当 SEQUENCE OF 类型作为可选成员时,利用其 count 字段在接口中充当 present 标识 -h, --help Prints help information --testcases 围绕已经定义的值,生成 testcase 的C文件和头文件, 依赖 --values --values 生成所有值的定义, 依赖 --mode full -V, --version Prints version information OPTIONS: -C, --cinline <需要生成内联C代码的类型列表,使用逗号隔开,由于生成代码可能非常多,不支持直接生成全部类型> 由于指定类型被直接展开为包含编解码逻辑的C代码,生成代码时编译程序将做一定程度的优化,使用该开关可以优化指定类型的编解码性能 --enum-as-uint <数据类型的名字(u8|u16|u32)> 设定ENUMERATED类型的C接口为u8,u16,u32数据类型,不使用C的enum类型 -e, --extension <扩展(rust)> rust-用于生成Native-Rust的头文件 --limits <规格配置文件,用于指定C数组的规格宏> 有关规格文件的 SCHEMA, 可以阅读 libcompiler/asn1rs-cli/examples/limits.schema.json -A, --long-abbrs <支持全词匹配功能的缩略表文件路径> 样例文件可以参考 libcompiler/asn1rs-cli/examples/long-abbrs.csv -m, --mode <编译模式(full|noinf)> full-完整生成接口和表的源码; noinf-仅生成表的源码; 默认-noinf -p, --prefix <生成C代码符号的前缀名字> 大小写不敏感 -a, --short-abbrs <支持单词匹配功能的缩略表文件路径> 样例文件可以参考 libcompiler/asn1rs-cli/examples/short-abbrs.csv -T, --try-compile <libcodec相对路径, 例如 ../libcodec> 尝试编译生成代码, 目前只支持目标语言为C/C++的场景, 编译器为GCC
示例
将一个ASN.1脚本test.asn转换成BER模式的C代码文件。
- test.asn脚本内容如下:
MyModule DEFINITIONS AUTOMATIC TAGS ::= BEGIN MyType ::= SEQUENCE { boolType BOOLEAN, intType INTEGER(0..128), enumType ENUMERATED { a, b }, bitStrType BIT STRING(SIZE(0..128)), octStrType OCTET STRING(SIZE(0..64)), seqOfType SEQUENCE OF INTEGER, choiceType CHOICE { a INTEGER(0..3), b BOOLEAN } } END
- 使用asn1rs-cli命令进行转换。
./asn1rs-cli -i test.asn -m ber cc -m full
生成的代码文件位于“exports”目录。exports └── test ├── codec_index.h ├── codec_interfaces.h └── codec_tables.c
- codec_index.h:定义了各个数据单元的唯一标识,在后续的编解码接口中需要使用到。
- codec_interfaces.h:提供了抽象语法中数据描述的C程序接口。
- codec_tables.c:定义了用于描述各个数据类型的静态变量。
若指定了--values --testcases参数还会生成codec_testcases.h、codec_values.c、codec_values.h三个文件,用于定义和声明脚本中定义的值,并生成测试用例。
父主题: 使用说明