[英]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.