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

时间:2015-03-03 02:31:20

标签: c# encoding asn.1

我一直在搜索这个主题一段时间,但没有找到任何相关的答案。所以考虑把它放在'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,可以用来减少编码大小吗?是否有任何示例,库或支持可以帮助实现这些编码样式?

4 个答案:

答案 0 :(得分:0)

在寻找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编码器解码器中查看更改的效果。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

如果您正在开始处理新协议,您可能需要稍微重新评估您的需求。

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

尽管如此,有些人更喜欢采用更具特色的方法。 Microsoft有一个BER converter class可以尝试与C#一起使用:它可能适合您的需要。

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

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

答案 3 :(得分:0)

我将其留在这里https://cloud.google.com/bigquery/quotas#load_jobs。还要感谢作者的工作!