我有一个存储在sqlite3数据库中的.png图片,以BLOB形式存储。
我正在尝试通过C++接口检索原始数据,如下所示:
RawImageWrapper* obj = 0;
int rc = sqlite3_exec(db, action.c_str(), imageSelectCallback, obj, &errMsg);
当action是我的SQL语句(它返回正确的记录)时,RawImageWrapper看起来像这样
struct RawImageWrapper
{
int callback(int argc, char **argv, char **azColName) {
for (int i = 0; i < argc; i++) {
if (strcmp(azColName[i], "Image") == 0) {
buff = std::string(argv[i]);
return 0;
}
}
return 1;
}
std::string buff;
};
使用字符串来保存图像数据可能不是最好的选择,但我只是想要一个快速的对象来包装char[]。然而,当它尝试构造buff时,会出现访问冲突。
从我的数据库中检索此图像blob并将其加载到某个容器中的正确方法是什么?我计划在稍后的时间从原始数据重新组成图像。
std::string
的构造函数接受const char*
作为参数,但是当遇到第一个 NUL 字符时就会停止。对于二进制数据来说,这可能会过早地终止字符串的读取,或者在读取时超出有效内存范围。如果不知道数据长度,就不能像这样读取二进制数据。 - IInspectablestd::string
并没有固有的问题(虽然std::vector<unsigned char>
可以更好地传达其目的)。你真正的问题是,你无法访问数据的长度。无论你使用哪种容器,你都需要知道数据的长度。 - IInspectablesqlite3_exec()
。 - CL.