gpt4 book ai didi

asn.1 - 什么是 ASN.1 及其优点/缺点?

转载 作者:行者123 更新时间:2023-12-04 18:43:57 29 4
gpt4 key购买 nike

我正在寻找非常通用、严格且与平台无关的序列化框架。我发现了一个叫做 ASN.1 的东西。

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

我有很多问题。也许我需要对 ASN.1 进行一些总体差异描述。

  • 什么是 ASN.1?
  • 这是否定义了严格的数据类型? (如 32 位整数、1 位 bool 值等)
  • C/C++ 中是否有引用实现?
  • 为什么这看起来不像 Apache Thrift、Protocol Buffers 或其他序列化工具那样流行?
  • 与其他序列化框架相比,ASN.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 位 bool 值。实际上,这是在以错误的方式考虑 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。

    关于asn.1 - 什么是 ASN.1 及其优点/缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18156739/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com