【发布时间】: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/…