[英]Insert char* as vector<byte> in sqlite
我试图将char*
(从文件中读取)作为字节数组( vector<byte>
)插入SQLite数据库,以避免被显式查看。
以下是我的代码,用于读取文件并将其作为字节数组存储在缓冲区中,
void DataBaseUtils::readFileContents(string filePath)
{
ifstream file(filePath, std::ios::binary);
if (!file) {
cerr << "An error occurred opening the file\n";
return;
}
file.seekg(0, ifstream::end);
size = file.tellg();
file.seekg(0);
char *buffer = new char[size];
file.read(buffer, size);
vector<byte> vByteArray(reinterpret_cast<byte>(buffer), size);
mBlobBuffer = (char*)&vByteArray;
mCharBuffer = buffer;
}
下面是我将数据插入源代码的位置,
std::stringstream strmInsert("");
strmInsert << "INSERT or IGNORE INTO SAMPLETABLE(NAME, CONTENTS) VALUES(" << "'" << getName() << "'," << '?' << ")";
string sInsert = strmInsert.str();
char *strInsert = &sInsert[0];
char *query1 = strInsert;
sqlite3_stmt *stmt = NULL;
int rc = sqlite3_prepare_v2(dbfile, query1, -1, &stmt, NULL);
if (rc != SQLITE_OK) {
cerr << "prepare failed: " << sqlite3_errmsg(dbfile) << endl;
}
else {
// SQLITE_STATIC because the statement is finalized
// before the buffer is freed:
rc = sqlite3_bind_blob(stmt, 1, mCharBuffer /*mBlobBuffer*/, size, SQLITE_STATIC);
if (rc != SQLITE_OK) {
cerr << "bind failed: " << sqlite3_errmsg(dbfile) << endl;
}
else {
rc = sqlite3_step(stmt);
if (rc != SQLITE_DONE)
cerr << "execution failed: " << sqlite3_errmsg(dbfile) << endl;
}
}
sqlite3_finalize(stmt);
在我的sqlite3_bind_blob
语句中,如果我使用mCharBuffer
,则查询可以正常运行,但是如果我使用mBlobBuffer
,则应用程序有时会崩溃并且有时可以正常工作,而没有任何模式。
我该如何解决并将文件内容作为BLOB数据插入到CONTENTS列中。
编辑:添加了图像以便清晰。 我想将BLOB数据作为第一张图片而不是第二张纯文本(ABCD ..)
通过将vector<byte>
存储在数据库中不可能掩盖您的文本,因为vector<byte>
对象并不包含您的文本。 不直接。
vector<byte>
基本上是一些指向您的文本的指针(可能为3),而没有其他指向。 存储向量仅存储那些指针。
遮盖文字的唯一方法是加密文字。
此代码的一个问题是,在设置mBlobBuffer
时,将std::vector<byte>
转换为char*
。 即使向量是char*
(不是),它也会在函数末尾销毁。 因此, mBlobBuffer
指向没有任何用处。
我会考虑将mCharBuffer
为向量,然后使用它。 这样可以避免动态分配。 像这样:
class DataBaseUtils
{
public:
void readFileContents(string filePath);
private:
// make this std::vector
std::vector<char> mCharBuffer;
};
void DataBaseUtils::readFileContents(string filePath)
{
std::ifstream file(filePath, std::ios::binary);
if (!file) {
std::cerr << "An error occurred opening the file\n";
return;
}
file.seekg(0, std::ios::end);
mCharBuffer.resize(file.tellg()); // no need to store the size elsewhere
file.seekg(0, std::ios::beg);
if(!file.read(mCharBuffer.data(), mCharBuffer.size())) {
std::cerr << "An error occurred reading the file\n";
return;
}
// need to encrypt the contents of the vector here
}
然后,当您将其放入函数中时:
rc = sqlite3_bind_blob(stmt, 1, mCharBuffer.data(), mCharBuffer.size(), SQLITE_STATIC);
大小记录在向量中。
另外,您不会记录错误发生的时间,我会抛出异常,而不仅仅是打印错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.