是否有一个好的 C++ 库来读取、创建和修改 BER 编码文件?

Posted

技术标签:

【中文标题】是否有一个好的 C++ 库来读取、创建和修改 BER 编码文件?【英文标题】:Is there a good C++ library to read, create and modify BER encoded files? 【发布时间】:2013-01-01 02:04:10 【问题描述】:

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

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

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

【问题讨论】:

ASN.1 encoded file的可能重复 我不确定这是否与 Joachim 的问题相同。我不仅需要多条记录,还需要与编辑器一样的灵活性。 我刚刚得出结论,对于 C++.NET,这些库存在:msdn.microsoft.com/en-us/library/… 但是,我没有在我的项目中使用 .NET。 请注意,通常您必须拥有与您要编码/解码的数据相对应的 ASN.1 规范。如果您正在寻找一种可以读取任意 BER 编码数据并选择 INTEGER 字段 &c 的工具。如果不将 ASN.1 规范作为输入,那么您的搜索将是徒劳的。 一般来说,是的。在我的情况下,ASN.1 规范是灵活的。它需要由用户而不是我作为开发人员来定义。这不是什么奇怪的情况。制作通用 ASN.1 编辑器的人也没有 ASN.1 规范。我正在寻找的存在:msdn.microsoft.com/en-us/library/…。但这是一个 C++.NET 解决方案。这个库有一个函数“static array^ Encode(String^ format, array^ value”。格式很灵活。这是我寻找的那种库(但不是.NET)。 【参考方案1】:

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

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

【讨论】:

问题是ASN定义是灵活的......这使得创建ASN定义文件变得困难。对于像这样的编辑器也是如此:codeproject.com/Articles/4910/ASN-1-Editor(在 C# 中)。我希望拥有与此编辑器相同的灵活性。【参考方案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 文件的编辑器,但它必须知道架构,否则它将无法正确读取任何内容。

【讨论】:

你在没有上下文的情况下使用“特定于上下文”的标签,这当然是模棱两可的!如果您引入“Application”或“Private”类,情况会变得更糟。仍然很有可能将数据一般解析并显示为十六进制字符串,即使编辑器不知道实际模式,您也可以对其进行编辑。只要一位编辑对此有所了解。 @SamuelÅslund - 绝对。我将 OP 解释为想要在不知道架构的情况下编辑 BER。【参考方案3】:

无耻自塞:

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

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

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

【讨论】:

谢谢你,第一个对这个话题有用的回应,从对正式语言的半知半解中“成长”。

以上是关于是否有一个好的 C++ 库来读取、创建和修改 BER 编码文件?的主要内容,如果未能解决你的问题,请参考以下文章

是否有一个很好的实用程序/第 3 方库来管理 AppEngine 数据存储?

如何编写一个 .so 库来替换现有的 C++ .so 库?

是否有任何库可以在 C++ 中使用 HFile 格式

C++ 使用GDAL库遥感影像失败,求解

是否有在 Windows Mobile 上用 C# 读取 JSON 的库? [关闭]

c++ netplan ubuntu yaml 读取和创建