c# - C# 中的 ASN.1 编码 BER、PER 等

标签 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)可用于减少编码大小?是否有任何示例、库或支持有助于实现这些编码样式?

最佳答案

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

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

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

关于c# - C# 中的 ASN.1 编码 BER、PER 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28823094/

相关文章:

c# - 从托管C#代码中调用非托管C++代码以生成脱机域加入Blob

c# - Gridview 更新返回 null

c# - 为什么 DrawString 看起来很糟糕?

c# - .NET 将十六进制值的字符串转换为 Unicode 字符(支持不同的代码页)

c - ANSI C - 使用动态数组创建的嵌套 BER TLV 元素的释放

c# - SQL Server中如何获取同一日期之间的记录

python-3.x - 如何使 python 3 print() utf8

c# - 我应该为西里尔字符使用哪种编码?

java - 使用自动标签的开源 Java ASN.1 解码器

ssl - 如何从 .key 和 .crt 文件中获取 .pem 文件?