The ASN.1 Compiler
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 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 -h或man 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模块规范的几个阶段工作:
- 第一阶段,解析ASN.1文件。(解析产生供后续阶段使用的ASN.1语法树)
- 第二阶段,修复语法树。(修复过程是检查语法树中的语义错误,并伴随着树形转换至规范形式)
- 第三阶段,将语法树编译为目标语言。
有一些命令行选项保留用于在每个操作阶段之后打印结果:
<解析器> => 打印 (-E) <解析器> => <修正器> => 打印 (-E -F) <解析器> => <修正器> => <编译器> => 打印 (-P) <解析器> => <修正器> => <编译器> => 保存编译结果 [默认]
-- Lev Walkin vlm@lionet.info