asn1c:ASN.1到C编译器,支持多种编码格式的序列化与反序列化

The ASN.1 Compiler

分支8Tags4
文件最后提交记录最后更新时间
7 年前
2 个月前
2 个月前
6 年前
7 年前
2 个月前
8 年前
2 个月前
8 年前
8 年前
2 个月前
2 个月前
10 年前
7 年前
8 年前
2 个月前
21 年前
2 个月前
8 年前
8 年前
9 年前
7 年前
8 年前
8 年前
3 个月前
2 个月前

关于

ASN.1到C编译器接收ASN.1模块文件(例如),生成与C++兼容的C源代码。这些代码可以用来序列化本地C结构,将其转化为紧凑且无歧义的基于BER/OER/PER/XER的数据文件,以及反序列化回这些文件。

各种基于ASN.1的格式在行业中广泛应用,如用于HTTPS握手时编码X.509证书,手机和蜂窝网络之间交换控制数据,以及智能交通网络中实现车对车通信。

ASN.1标准族庞大而复杂,目前没有开源编译器能完全支持它。asn1c可能是最成熟的开放源码ASN.1编译器。

ASN.1传输语法

ASN.1编码互操作性表

ASN.1标准族定义了多种数据编码方式,包括字节导向型(如BER)、位导向型(如PER)和文本型(如XER)。某些编码变体(如DER)只是更通用编码(如BER)的严格版本。

以下互操作性表格指定了哪些API函数可用于以兼容方式交换数据。如果你需要根据第1列中的标准生产数据,使用第2列中的API函数。如果你需要处理符合第3列中指定的标准的数据,使用第4列中的API函数。详情参见doc/asn1c-usage.pdf

编码 API 函数 可理解的编码 API 函数
BER der_encode() BER ber_decode()
DER der_encode() DER, BER ber_decode()
CER 不支持 CER, BER ber_decode()
BASIC-OER oer_encode() *-OER oer_decode()
CANONICAL-OER oer_encode() *-OER oer_decode()
BASIC-UPER uper_encode() *-UPER uper_decode()
CANONICAL-UPER uper_encode() *-UPER uper_decode()
*-APER 不支持 *-APER 不支持
BASIC-XER xer_encode(XER_F_BASIC) *-XER xer_decode()
CANONICAL-XER xer_encode(XER_F_CANONICAL) *-XER xer_decode()

*)星号表示基本和规范两种变体。

构建与安装

如果你还未安装asn1c,请阅读INSTALL.md文件获取简短的安装指南。

构建状态

文档

关于asn1c命令行选项的列表,请参考asn1c -hman asn1c

此编译器的详细文档在doc/asn1c-usage.pdf

请也查阅FAQ文件。

Olivier Dubuisson撰写了一本有关ASN.1的优秀书籍:“ASN.1:异构系统之间的通信”,ISBN:0-12-6333361-0。

快速入门

(也可查看doc/asn1c-quick.pdf

安装编译器后(见INSTALL.md),你可以使用asn1c命令来编译ASN.1规范:

asn1c <module.asn1> # 编译模块

如果有多个包含相互依赖关系的规范,必须同时指定它们:

asn1c <module1.asn1> <module2.asn1> ... # 编译互相依赖的模块

asn1c源代码tarball中包含了examples/目录,其中包含几个ASN.1模块及一个脚本,用于从RFC文档中提取ASN.1模块。请参阅该目录中的examples/README文件。

要编译X.509 PKI模块:

./asn1c/asn1c -P ./examples/rfc3280-*.asn1 # 编译并打印

在此示例中,-P选项用于将编译结果打印到标准输出。默认情况下,asn1c编译器会为指定ASN.1模块中找到的每个ASN.1类型创建多个.c和.h文件。

编译器的**-E-EF**选项分别用于测试解析器和语义修正器。这些选项会指示编译器输出被“理解”的已解析(和修正)的ASN.1规范。这可能有助于检查编译器是否正确支持特定的语法构造。

asn1c -EF <module-to-test.asn1> # 检查语义有效性

工作模型

asn1c编译器通过处理ASN.1模块规范的几个阶段工作:

  1. 第一阶段,解析ASN.1文件。(解析产生供后续阶段使用的ASN.1语法树)
  2. 第二阶段,修复语法树。(修复过程是检查语法树中的语义错误,并伴随着树形转换至规范形式)
  3. 第三阶段,将语法树编译为目标语言。

有一些命令行选项保留用于在每个操作阶段之后打印结果:

<解析器> => 打印 (-E) <解析器> => <修正器> => 打印 (-E -F) <解析器> => <修正器> => <编译器> => 打印 (-P) <解析器> => <修正器> => <编译器> => 保存编译结果 [默认]

-- Lev Walkin vlm@lionet.info

项目介绍

ASN.1编译器【此简介由AI生成】

定制我的领域
971.17 K620访问 GitHub