【发布时间】:2017-03-10 13:54:57
【问题描述】:
我有一个 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::stringc'tor 在遇到第一个 NUL 字符时停止使用const char*。对于二进制数据,这可能会过早终止。或者它可能会持续阅读太长时间,从而进入无效内存。如果不知道它的长度,你就无法读取这样的二进制数据。 -
我明白了,您知道为此目的使用更好的对象而不是字符串吗?
-
std::string本身并没有错(尽管std::vector<unsigned char>会更好地传达其目的)。您真正的问题是,您无权访问数据长度。不管你使用什么容器,你都需要知道数据的长度。 -
嗯,我想我必须想办法从 API 中获取它,谢谢您的帮助
-
您必须将
sqlite3_exec()替换为a cursor。