簡體   English   中英

插入char *作為向量 <byte> 在sqlite中

[英]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數據的樣本圖像

示例圖像以顯示純文本

編輯:添加了圖像以便清晰。 我想將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM