我正在嘗試從 dll 中讀取嵌入式資源,它包含一個加密檔案。從 讀取它LockResource(),只回傳一半的資料。
有趣的是,我檢查SizeOfResource()了資源的大小是應該的。
因此,我嘗試訪問該檔案而不將其作為嵌入式資源:
std::ifstream enc("Logs.enc" , std::ios::binary); // Accessing encrypted file
std::string ciphertext = std::string((std::istreambuf_iterator<char>(enc)), std::istreambuf_iterator<char>());
int size = ciphertext.size(); // Returns the correct size
這行得通,我試圖找到它們的共同點,并嘗試洗掉它們std::ios::binary,它與將檔案作為資源訪問時具有相似的行為。
這是我嘗試將其作為資源訪問:
HGLOBAL SHEET_DATA; // Imagine this has the encrypted file
if (SHEET_DATA) {
char* datac = nullptr;
datac = (char*)LockResource(SHEET_DATA);
std::string data = datac;
long size_sheet = SizeofResource(dll, SHEET); //
int real_size = data.size(); // Returns the wrong size
}
我試圖搜索是否有任何東西,例如LockResource()以二進制模式訪問資料的函式,但我找不到任何結果。
謝謝
uj5u.com熱心網友回復:
strlen假設引數是一個以零結尾的字串。它對字符進行計數,直到達到零終止。
在您的情況下,資源似乎是二進制的。在這種情況下,它可能包含值為 0 的位元組,它被strlen視為字串的結尾。
因此strlen回傳什么是無關緊要的。您可以使用size_sheet回傳SizeofResource來了解 所指向的資料的大小datac。
更新:
更新后的問題不再包含 的用法strlen。但是這條線:
std::string data = datac;
創建一個類似的問題。std::string從 a初始化 anchar*假定char*is 指向一個以零結尾的字串。因此,如果緩沖區包含零,則生成的字串將只包含直到第一個零的字符。std::string您可以通過以下方式初始化以避免零終止的假設:
std::string data(datac, size_sheet);
將緩沖區的長度提供給 ctorstd::string將強制使用完整的緩沖區進行初始化(忽略零)。
Update2:正如@IInspectable 下面評論的那樣,如果資料不是真正的字串,最好將其保存在更合適的容器中 - 例如std::vector<char>。它還有一個接受 achar*和緩沖區長度的建構式。
uj5u.com熱心網友回復:
問題是這一行:
std::string data = datac;
這std::string從一個以 null 結尾的字串構造 a 。但datac它不是一個以空值結尾的字串,正如你所說的它是二進制資料。相反,使用string (const char* s, size_t n);ctor 多載:
std::string data(datac, size_sheet);
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/464808.html
