9

有几种工具可以自动生成用于读取和写入 BER 编码文件的 C++(或其他)代码。在我的 C++ 项目中,我需要库来读取和修改 BER 编码文件。我无法基于给定的数据结构生成 C++ 类,因为没有给定的数据结构。用户应该能够添加和删除整数、字符串等。我找到了一个具有此类功能的编辑器的开源项目:http: //www.codeproject.com/Articles/4910/ASN-1-Editor

但是,这是在 C# 中......

请告诉我,如果您知道如何获得具有此功能的优秀 C++ 库,可用于我的 C++ 项目。

4

3 回答 3

2

没有过多的通用 BER 读取库,因为在没有至少一些架构知识的情况下明确解析任意 BER 数据是不可能的。

您在 CodeProject 中指向的工具编辑 ASN.1 模式,这些模式用于创建 BER 编码,但您不能在不了解数据或猜测的情况下朝另一个方向前进。无法通过查看 BER 元素的 id 和长度来判断该元素是否包含原始数据或其他 BER 元素。

这是我想出的用于演示该问题的最小示例,只有 5 个字节,有两种截然不同的解释:

0xA0 0x03 0x02 0x01 0x00

现在,这显然是一种构造的、特定于上下文的类型。它也有一定的长度。但里面是什么?你说不出来!

它可以是一个整数(0x02 是整数的原始标记,0x01 是 len,值 0x00)。

但它也可以是一个位串(你可以将一个位串放入一个构造类型中,然后 2 是最后未使用的位数,这意味着我们有 14 位,即 0000 0001 0000 00xxb = 00 0000 0100 0000b = 0x0040。

您可以编写一个可以读取/修改/写入 BER 文件的编辑器,但它必须知道架构,否则它将无法正确读取任何内容。

于 2013-11-22T21:24:58.127 回答
2

确保您拥有正确的 ASN 定义文件。然后去链接http://lionet.info/asn1c/asn1c.cgi

将您的 ASN 定义粘贴到给定的窗口中。按下按钮“继续 ASN.1 编译”。如果您收到任何编译错误,请纠正这些错误。编译成功后,它将为您的解码器生成代码。试一试它的好。

于 2013-01-17T14:07:02.853 回答
1

无耻自塞:

我创建了一个提供现代 C++ 接口的开源 ASN1 ber 编码器/解码器库。

该库提供了一个编译器,它根据 ASN.1 规范生成 .hpp 包含文件。包含文件中提供了根据这些规范对 BER 数据进行编码和解码的功能。

https://github.com/Samuel-Tyler/fast_ber

于 2019-03-22T21:18:58.867 回答