【问题标题】:ASN.1 encodings BER, PER etc. in C#ASN.1 在 C# 中编码 BER、PER 等
【发布时间】:2015-03-03 02:31:20
【问题描述】:

我一直在搜索这个主题,但没有找到任何相关的答案。所以想把它放在'*'上......

我们正在尝试对字符串进行编码,以便通过 TCP/IP 连接传递它。由于 ASN.1 是最流行的一种,因此我们正在尝试各种规则 BER、DER、PER 等,以找出我们可以使用哪一种。我们的应用程序是一个基于 .net 的应用程序,我正在寻找可以免费使用的库。

奇怪的是,我找不到任何免费的库。所以,我开始寻找 .Net 框架本身。我发现只有一个“BERConverter”。所以,我用它做了一个小例子。以字符串为例

string str = "The BER format specifies a self-describing and self-delimiting format for encoding ASN.1 data structures. Each data element is encoded as a type identifier, a length description, the actual data elements, and, where necessary, an end-of-content marker. These types of encodings are commonly called type-length-value or TLV encodings. This format allows a receiver to decode the ASN.1 information from an incomplete stream, without requiring any pre-knowledge of the size, content, or semantic meaning of the data" 

在 UTF-8 或 ASCII 中,它显示为 512 个字节。我使用以下代码使用 BER 对其进行编码

public static byte[] BerConvert(byte[] inputbytes)
    {
        byte[] output = BerConverter.Encode("{o}", inputbytes);
        return output;
    }    

我得到一个大小为 522 的字节数组。在其他一些情况下,我发现字节大小与原始文本相比有所增加。我认为编码会减小大小。为什么会这样?

除了 BER 之外,还有其他编码规则,例如 PER 或 DER 可以用来减小编码大小吗?是否有任何示例、库或支持可以帮助实现这些编码样式?

【问题讨论】:

  • 为什么 ASN.1 编码会减小大小?那不是它的用途。为此使用压缩。
  • @NathanTuggy,好吧,ASN.1 数据包编码规则都是关于最小化用于表示数据的位数。例如,值为10 的整数不需要32 位,只需要4 位。 PER 利用了这一点,仅使用该整数的当前值所需的位数(加上一些额外的边界标记等)。相比之下,程序必须在源代码中使用int 来表示相同的整数,或者如果知道它永远不会> 127,则可能使用int8。没有int4。因此 PER 编码可以小于内存中值的大小。
  • 我今天一直在寻找 C# ASN.1 解码器,最接近的有用资源是 ESA C 编译器,据说它可以扩展以支持未来的更多语言......但我看不到任何人还在使用 taste.tuxfamily.org/wiki/…

标签: c# encoding asn.1


【解决方案1】:

在寻找 ASN.1 工具(免费和商业)时,一个很好的起点是 ITU-T 网页http://www.itu.int/en/ITU-T/asn1/Pages/Tools.aspx,其中列出了几个。那里列出了支持 C# 的商业工具,但我没有看到免费的 C# 工具。

至于编码大小的减少,这在很大程度上取决于您的 ASN.1 规范的性质和使用的编码规则。如果您主要发送文本字符串,BER 和 DER 不会导致消息大小的减小,而 PER 可以显着减小消息的大小,如果您能够生成“允许的字母表”约束来指示较小的集合您发送的文本中允许的字符数。

您可以在http://asn1-playground.oss.com 的免费在线 ASN.1 编码器解码器上尝试各种编码规则和不同的约束来查看更改的效果。

【讨论】:

    【解决方案2】:

    如果您开始研究新协议,您可能需要重新评估一下您的需求。

    您现在可能已经知道,ASN.1 会带来一些开销——不仅在消息传递方面,而且在工程方面。典型的工作流程包括编写描述协议的规范,将其输入到为 API 生成源代码的 CASE 工具中,然后将生成的组件集成到您的应用程序中。

    也就是说,有些人更喜欢临时性的方法。 Microsoft 有一个 BER converter class,您可以尝试将其与 C# 一起使用:它可能适合您的需求。

    如果压缩很重要,您可能需要研究 PER,正如 Paul 所说。但是手动生成有效的 PER 编码是很困难的,因为它们依赖于规范来执行压缩。 (允许的字母约束写入规范,用于枚举有效字符以缩小编码。)

    有关 ASN.1 的更多信息,有许多在线教程;您还可以查看 ITU-T 标准X.680-X.695,其中指定了语法符号和各种编码规则。

    【讨论】:

      【解决方案3】:

      CodePlex 上有一些库。喜欢这个。

      https://asn1.codeplex.com/SourceControl/latest#ObjectIdentifier.cs

      【讨论】:

        【解决方案4】:

        我就把它留在这里Asn1DerParser.NET。并感谢作者的工作!

        【讨论】:

          最近更新 更多