2

我正在一个没有操作系统的非常特定的平台上工作。手头的任务需要将字符串和位图等资源存储在原始二进制数据中,与二进制代码分开,以便在运行时访问它。

我们有直接的存储块读写机制实现,但没有文件系统。该语言主要是 C++,没有模板和异常,这是平台编译器的限制,所以没有 stl 和 boost。

鉴于这些限制,我需要一种简单的数据库存储方法来将上述资源存储在磁盘上并使用某种密钥访问它们。我暂时推出了自己的产品,它使用简单的平面二进制存储,并且可以使用数字 id 进行寻址 - 用于获取资源原始字节偏移量的表索引。然而,这确实不方便使用,因为我必须手动跟踪资源 ID 并确保它们从 0 开始按顺序分配。

我在想也许已经有更好的库解决方案可以相对容易地修改以适应要求,并且可以在我开始推出散列函数之前与代码库集成,以便我可以使用短字符串作为键?存储在生成后是恒定的,并且仅用于读取。

编辑:我想我需要的是一个资源 dll 的替代品,它可以在没有运行时链接器和文件系统的情况下工作(或轻松工作)。

4

3 回答 3

2

你考虑过使用 SQLite 吗?我发现它作为一个小型本地化数据库运行良好,它不需要“实例”或持续运行的进程,只需要一个文件。它很容易集成到 C++ 中。

http://www.sqlite.org/

于 2012-05-14T16:15:14.027 回答
2

鉴于您对自定义操作系统、特定数据和受限资源的限制。我认为您唯一的选择是自己滚动。

又快又脏:http ://elliottback.com/wp/hashmap-implementation-in-c/

后续编辑:在您的工具阶段使用相同的代码将 XML 或其他数据源转换为您的“哈希映射”。使用中发现的差异可以被记录、上传、收集并反馈到构建中。

这可能是一个“通用”问题,但它经常发生在嵌入式开发中。有一点是你想要的与你所拥有的相冲突,需要进行健全性检查。通常一个保守的“简单”解决方案是一个更好的开始,而且您似乎已经有了一个。

于 2012-05-15T12:49:32.160 回答
0

之前曾多次解决过这个问题,我同意“自己动手”的答案。在不了解更多(您的平台、IDE、应用程序等)的情况下,我只能提供一个参考点。

我们的策略构建了包含屏幕布局、声音、位图和字体表的二进制包。每个包都包含一个标头,用于标识存储在包中的资源的数量和类型,以及指向每个资源开头的偏移量。(包元数据的结构受到带有 IFD 块等的 JPEG/TIFF 标头的粗略启发)。在一些实现中,我们从 NAND 闪存加载,因此我将 16 位 CRC 与每个资源相关联。其他实现添加了一个“压缩”标志来标识使用 zlib 压缩的资源。

From a workflow perspective: our IDE provided a python interpreter, which allowed me to implement scripts to automate construction of the resource package. This also allowed me to embed the resulting package directly into the hex file comprising the binary image.

于 2012-05-17T13:44:02.067 回答