什么是 ASN.1 及其优缺点?
Posted
技术标签:
【中文标题】什么是 ASN.1 及其优缺点?【英文标题】:What is ASN.1 and it's pros/cons? 【发布时间】:2013-08-09 22:43:03 【问题描述】:我一直在寻找非常通用、严格且独立于平台的序列化框架。我发现了一个叫做 ASN.1 的东西。
它看起来像是与序列化有关的东西,但实际上我无法理解它是什么。我阅读了 Wikipedia 文章和 ITU article,但仍然很难知道。
我有很多问题。也许我需要 ASN.1 的一些整体差异描述。
什么是 ASN.1? 这是否定义了严格的数据类型? (如 32 位整数、1 位布尔值等) 是否有 C/C++ 中的参考实现? 为什么这不像 Apache Thrift、Protocol Buffers 或其他序列化东西那样受欢迎? 与其他序列化框架相比,ASN.1 的优缺点是什么?【问题讨论】:
【参考方案1】:什么是 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。
【讨论】:
它看起来很复杂。是否有标准的消化版本...? 如果您搜索它们,您可以在网上免费找到两本书。它们是 John Larmouth 的“ASN.1 Complete”和“ASN.1:异构系统之间的通信”。通过奥利维尔杜比松。我从来没有花太多时间看这些书,因为我更喜欢阅读规范(去源头),但我知道其他人更喜欢这些书,并在必要时求助于规范。【参考方案2】:这是 ISO 定义的序列化标准。
是的,尽管一个值占用的最小空间是 (afaik) 5 位。
我不知道一个完整的,虽然我并没有声称自己都知道。
很难以中立的方式回答,但就我所经历的主要复杂性而言,接近完整的实现是困难。
参见 4。ASN.1 的空间效率相当高(protobuf 可能会物有所值),但与大多数其他序列化方法相比,它看起来也相当复杂。最后,复杂性通常会丢失(通常“为阅读规范付费”也是如此)
【讨论】:
【参考方案3】:http://vii.path.berkeley.edu/1609_wave/feb13/Presentations/ASN.1%20Tutorial%20San%20Diego.pptx 的幻灯片可能会解决您的一些问题。
【讨论】:
以上是关于什么是 ASN.1 及其优缺点?的主要内容,如果未能解决你的问题,请参考以下文章