什么是 ASN.1?我想维基百科几乎告诉你它是什么。要理解 ASN.1,您必须意识到 ASN.1 将两个关注点分开:描述您的数据和描述您的数据在传输中的样子。
第一部分是描述您的数据。ASN.1 指定了一个抽象语法符号(因此称为 ASN.1)来执行此操作。例如,我可以指定 Coordinate 是一个复数,由必须介于 0 和 100 之间的两个整数组成:
Coordinate ::= SEQUENCE {x INTEGER(0..100), y INTEGER(0..100) }
下一部分是决定如何将其编码为字节以进行传输。ASN.1 指定了一些标准的编码规则集来执行此操作。不同的编码规则各有优势。大多数是二进制的,但一种是基于文本的(XER 编码为 XML)。编码规则在位级别指定如何表示使用上述抽象描述描述的值。遵循标准的每个人(并同意编码规则)都会得到完全相同的比特串。
PER 编码规则使用抽象定义中的约束来提供更紧凑的编码。例如,如果您知道整数范围为 0..100,则只需 7 位即可对这些值进行编码。
ASN.1 没有定义 32 位整数或 1 位布尔值。实际上,那是以错误的方式考虑 ASN.1,因为那是在考虑值的字节表示。同样,ASN.1 将您的值的描述(我有一个介于 0 和 100 之间的整数)与您的值的表示(我可以用 7 位表示该值)分开。
我不知道参考实现;我不确定谈论一个是否有意义。我的公司销售一种从抽象语法定义生成 C/C++/Java/C# 数据结构和代码的工具。有一些类似的免费工具;我不知道他们的质量。
ASN.1 与序列化框架相比如何?ASN.1 不是序列化框架。也就是说,它没有说明如何获取任何类型的编程数据结构或对象并对其进行编码。它提供了一种抽象描述数据值的方法,并指定了导出这些值的编码的规则。ASN.1 的一个常见用法是使用代码生成器从抽象描述中生成编程数据结构,以及遵循所选编码规则的编码/解码方法。当然,也可以完全手动完成。
ASN.1 的优势?使用工具生成代码的能力。除此之外,还可以灵活地从相同的抽象语法生成不同的编码(例如 XML、PER)。
ASN.1 的缺点?可能很复杂,尽管我怀疑一个人可以使用工具完成很多工作,而不必消化所有复杂性(例如,您可能依赖工具来做正确的事情而不是尝试消化编码规则规范。 )。
更新:现在有第二组基于文本的编码规则。JER 编码为 JSON。