什么是ASN.1及其利弊?

时间:2013-08-09 22:43:03

标签: asn.1

我一直在寻找非常通用,严格且独立于平台的序列化框架。我发现了一种叫做ASN.1的东西。

它看起来像是与序列化相关的东西,但我实际上无法理解它是什么。我读过维基百科的文章和ITU article,但仍然很难知道。

我有很多问题。也许我需要一些ASN.1的差异描述

  • 什么是ASN.1?
  • 这是否定义了严格的数据类型? (例如32位整数,1位布尔值等)
  • C / C ++中是否有参考实现?
  • 为什么这看起来不像 Apache Thrift Protocol Buffers 或其他序列化内容一样流行?
  • 与其他序列化框架相比,ASN.1的优缺点是什么?

3 个答案:

答案 0 :(得分:6)

什么是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的缺点?可能复杂,虽然我怀疑一个人可以使用工具完成很多工作,而不必消化所有的复杂性(例如,你可能依靠工具来做正确的事情而不是试图消化编码规则规范。 )。

答案 1 :(得分:1)

答案 2 :(得分:0)

  1. 这是ISO定义的序列化标准。

  2. 是的,虽然值占用的最小空间是(afaik)5位。

  3. 我不知道一个完整的,虽然我并不是自称完全知道。

  4. 难以以中立的方式回答,但就我经历的主要复杂性而言,接近完整的实施是 hard

  5. 请参阅4. ASN.1相当节省空间(protobuf可能会为其付出代价),但与大多数其他序列化方法相比,它看起来也相当复杂。最后,复杂性经常会丢失(通常也会“支付阅读规格”)