C++ 无法使用来自sqlite blob的boost反序列化
我正在尝试从sqlite读取blob数据并对其进行反序列化 我的代码C++ 无法使用来自sqlite blob的boost反序列化,c++,sqlite,opencv,boost,C++,Sqlite,Opencv,Boost,我正在尝试从sqlite读取blob数据并对其进行反序列化 我的代码 int init_search(std::string db_path, cv::Mat *voc1, std::list<std::string> *desc_lst) { sqlite3 *sqdb; int rc; unsigned char *bow_data; const char *bow_key ; int bow_size; cv::Mat bow_
int init_search(std::string db_path, cv::Mat *voc1, std::list<std::string> *desc_lst)
{
sqlite3 *sqdb;
int rc;
unsigned char *bow_data;
const char *bow_key ;
int bow_size;
cv::Mat bow_desc,desc_tmp;
//const size_t data_size_bow;
rc = sqlite3_open("C:\\aa\\cvdb\\dna.db", &sqdb);
sqlite3_stmt *stmt = NULL;
do
{
rc = sqlite3_prepare_v2(sqdb, "SELECT * FROM dna_tab", -1, &stmt, NULL);
//sqlite3_bind_text(stmt, 3, bow_key, -1, SQLITE_STATIC);
rc = sqlite3_step(stmt);
if (rc == SQLITE_ROW)
{
bow_size = sqlite3_column_bytes(stmt, 3);
bow_data = (unsigned char *)malloc(bow_size);
//memcpy(bow_data, sqlite3_column_blob(stmt, 3), bow_size);
//std::stringstream s(bow_key,std::ios_base::in |std::ios_base::binary);
std::stringstream s((const char *)sqlite3_column_blob(stmt, 3), std::ios_base::binary);
boost::archive::binary_iarchive oa(s, std::ios_base::binary);
oa >> bow_desc;
cout << bow_desc;
}
rc = sqlite3_finalize(stmt);
} while (rc == SQLITE_SCHEMA);
sqlite3_close(sqdb);
return 0;
}
int init_搜索(std::string db_path,cv::Mat*voc1,std::list*desc_lst)
{
sqlite3*sqdb;
int rc;
无符号字符*bow_数据;
常量字符*弓形键;
int bow_大小;
cv::垫弓描述,描述tmp;
//常数大小数据大小弓;
rc=sqlite3_open(“C:\\aa\\cvdb\\dna.db”、&sqdb);
sqlite3_stmt*stmt=NULL;
做
{
rc=sqlite3_prepare_v2(sqdb,“从dna_选项卡中选择*,-1,&stmt,NULL);
//sqlite3绑定文本(stmt,3,弓形键,-1,SQLITE静态);
rc=sqlite3_步(stmt);
if(rc==SQLITE\u行)
{
bow_size=sqlite3_列_字节(stmt,3);
bow_数据=(无符号字符*)malloc(bow_大小);
//memcpy(bow_数据,sqlite3_列_blob(stmt,3),bow_大小);
//std::stringstreams(bow_key,std::ios_base::in | std::ios_base::binary);
std::stringstreams((const char*)sqlite3\u column\u blob(stmt,3),std::ios\u base::binary);
boost::archive::binary\u iarchive oa(s,std::ios\u base::binary);
oa>>船首描述;
cout谢谢大家,谷歌通过定义自定义streambuf的下溢解决了这个问题
int underflow()
{
int rec= sqlite3_blob_read(_blob, buf, max_blob_size, 0);
if (rec != SQLITE_OK) return traits_type::eof();
setg(buf, buf, buf + max_blob_size);
return traits_type::to_int_type(*gptr());
}
这是重载streambuf的粗糙方法,但目前我的工作已经完成了…我不能帮你,但你可以看看如何(反)序列化一个映像(示例在iostream上,但我想你可以很容易地适应)。为什么不干脆放弃所有的boost废话,将行、列、类型、数据写入您的sqlite db?@miki-示例使用的是istream默认接受的文件流,但我在传递StreengStream时出错,我想我无法适应,因为我对CPP和boost@DipakMallick因此,您希望在stringstr中序列化图像eam
,或者char*
,或者什么?@miki我想应该是char*,因为我从blob中得到char*
int underflow()
{
int rec= sqlite3_blob_read(_blob, buf, max_blob_size, 0);
if (rec != SQLITE_OK) return traits_type::eof();
setg(buf, buf, buf + max_blob_size);
return traits_type::to_int_type(*gptr());
}