我正在一个没有操作系统的非常具体的平台上工作。手头的任务需要存储诸如字符串和位图之类的资源,所有这些都在原始二进制数据中与代码二进制文件分开,以便在运行时访问它。
我们有直接存储块读写机制实现但没有文件系统。该语言主要是C ++,没有模板和异常,这是一个平台编译器限制,所以没有stl和boost。
鉴于这些限制,我需要一种简单的数据库存储方法,将上述资源存储在磁盘上,并使用某种密钥访问它们。我暂时使用简单的平面二进制存储来自行编写,并且可以使用数字id进行寻址 - 一个表索引来获取资源的原始字节的偏移量。然而,这非常不方便使用,因为我必须手动跟踪资源ID并确保它们从0开始按顺序分配。
我想也许已经有更好的库解决方案可以相对容易地修改以满足要求,并且可以在我开始推出散列函数之前与代码库集成,这样我可以使用短字符串作为键?存储一旦生成就会保持不变,只能进行读取。
编辑:我想我需要的是在没有运行时链接程序和文件系统的情况下替代可以工作(或轻松工作)的资源dll。
答案 0 :(得分:2)
你考虑过使用SQLite吗?我发现它作为一个小的本地化数据库工作得很好,它不需要“实例”或不断运行的进程,只需要一个文件。它很容易集成到C ++中。
答案 1 :(得分:2)
考虑到您对自定义操作系统,特定数据和受限资源的限制。我认为你唯一的选择是自己动手。
快速而肮脏:http://elliottback.com/wp/hashmap-implementation-in-c/
后续编辑: 在工具阶段使用相同的代码从XML或其他数据源转换到“哈希映射”。可以记录,上传,收集使用中发现的差异并将其反馈到构建中。
这可能是一个“通用”问题,但它通常发生在嵌入式开发中。有一点,你想要的东西与你拥有的东西冲突,需要进行健全性检查。通常一个保守的“简单”解决方案是一个更好的开始,似乎你已经有了一个。
答案 2 :(得分:0)
之前曾多次解决这个问题,我同意“滚动你自己”的答案。如果不了解更多(您的平台,IDE,应用程序等),我只能提供一个参考点。
我们的策略构建了包含屏幕布局,声音,位图和字体表的二进制包。每个包都包含一个标题,用于标识包中存储的资源的数量和类型,以及指向每个资源开头的偏移量。 (包元数据的结构受到带有IFD块的JPEG / TIFF头的松散启发等)。在几个实现中,我们从NAND闪存加载,因此我将16位CRC与每个资源相关联。其他实现添加了“压缩”标志以标识使用zlib压缩的资源。
从工作流的角度来看:我们的IDE提供了一个python解释器,它允许我实现脚本来自动构建资源包。这也允许我将生成的包直接嵌入到包含二进制图像的hex文件中。