ASN.1编码C#中的BER,PER等

问题描述 投票:2回答:3

我一直在搜索这个主题一段时间,没有找到任何相关的答案。所以考虑把它放在'Stackoverflow'上......

我们正在尝试对字符串进行编码,以便通过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,可用于减少编码大小?是否有任何示例,库或支持可以帮助实现这些编码样式?

c# encoding asn.1
3个回答
0
投票

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

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

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


0
投票

0
投票

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

正如您现在可能知道的那样,ASN.1带来了一些开销 - 不仅仅是在消息传递中,而是在工程中。典型的工作流程包括编写描述协议的规范,将其提供给CASE工具,该工具生成API的源代码,然后将生成的组件集成到应用程序中。

也就是说,有些人更喜欢采用更具特色的方法。 Microsoft有一个BER converter class,您可以尝试使用C#:它可能适合您的需要。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.