2016-07-27 67 views
0

我是一名Web開發人員,我是C++的新手。我正在使用Qt C++。我正在尋找一種在Qt中生成PBKDF2鍵的方法,但找不到在純C++中執行此操作的方法。所以在互聯網上看,我發現這個小C實現https://github.com/ctz/fastpbkdf2。我需要使用下面的函數如何在Qt中使用C函數C++

void fastpbkdf2_hmac_sha256(const uint8_t *pw, size_t npw, 
          const uint8_t *salt, size_t nsalt, 
          uint32_t iterations, 
          uint8_t *out, size_t nout) 

在我的C++文件,我有

QString password = "password"; 
QString salt = "salt"; 
int iterations = 30000; 

我知道我可以直接調用C++的任何C函數,但我不知道我怎麼能叫與我的C++文件中的那些參數一起工作。數據類型轉換的解釋也將被讚賞。

+0

在答案中,我注意到人們列出了轉換QString的不同方式(使用toStdString()或使用QByteArray)。哪一個會被優先考慮? –

+0

我也想澄清一下如何顯示這個函數的輸出。 –

+0

另外我怎樣才能將uint8_t轉換爲QString? –

回答

1

所有你需要轉換QString時,CHAR(或uint8_t):

QString passoword = "password"; 
QByteArray ba = password.toLatin1(); 
const uint8_t *pw = (const uint8_t*)ba.data(); 

而且你可以在函數中使用此PW。 「鹽」也一樣。您可以照原樣使用「迭代」。對於「out」參數,用任何你喜歡的方法分配uint8_t,可以是malloc。

+2

如果您想要支持Latin-1範圍之外的Unicode字符,您可能需要調用toFF8()。 –

1

uint8_t是一個無符號的8位整數的類型定義,或者換句話說,一個無符號的字符。

uint32_t是一個無符號32位整數的類型定義,或換句話說一個無符號整數。

這些類型定義在stdint.h中定義。引入這些類型以便爲可移植性定義明確的(寬度方向)整數類型。

size_t通常也是無符號整數類型。所以 原型:

void fastpbkdf2_hmac_sha256(const uint8_t *pw, size_t npw, 
          const uint8_t *salt, size_t nsalt, 
          uint32_t iterations, 
          uint8_t *out, size_t nout) 

等同於:

void fastpbkdf2_hmac_sha256(const unsigned char* pw, unsigned int npw, 
          const unsigned char* salt, unsigned int nsalt, 
          unsigned int iterations, 
          unsigned char* out, unsigned int nout); 

其他人發佈如何轉換成QString的無符號字符數組。

+0

這對於大多數平臺都適用,但請記住,C99類型(帶'_t'的類型)是規範定義的,使得它們本質上更具可移植性。 'unsigned int'以及其後的格式是編譯器類型,它使編譯器實現來定義它們。如果您正在爲單個平臺編寫代碼,或者您的代碼不需要確切知道底層內存是什麼,那麼編譯器類型就可以。 – Iverelo

-1

我對QT不太熟悉,所以我正在尋找this page作爲QString的參考。它似乎是一個託管的字符串對象,而您想要調用的函數只需要以uint8_ts爲空的終止數組。我認爲它是包裝std :: string,因爲有一個toStdString()成員函數。一個std :: string只是管理一個字符數組,它是你的函數所需要的,所以你可以這樣做:password.toStdString()。c_str()得到char *。

大多數平臺都會隱式轉換uint8_t和char,因爲它們幾乎總是直線向上1個字節的內存。

還有一個輸出緩衝區,通過調用約定,它看起來像你必須管理該內存。從看過你鏈接的github文檔看,你會告訴它使用nout時會輸出多少內存。在這個例子中,我們創建了一個256字節的緩衝區供它輸出。

QString password = "password"; 
QString salt = "salt"; 
int iterations = 30000; 

const size_t nout = 256; 
uint8_t * out = new uint8_t[nout]; 

fastpbkdf2_hmac_sha256(password.toStdString().c_str(), password.toStdString().size(), 
    salt.toStdString().c_str(), salt.toStdString().size(), 
    iterations, 
    out, nout); 

// use out 

delete[] out; 
+0

這給了我錯誤:從'const char *'無效轉換爲'const uint8_t * {aka const unsigned char *}' –

+0

嘗試[reinterpret_cast](http://en.cppreference.com/w/cpp/語言/ reinterpret_cast)()欺騙編譯器,因爲底層內存是相同的。 – Iverelo

+0

這似乎工作 –