2011-10-18 54 views
1

我想散列一個字符串,然後使用該散列作爲文件的名稱。我可以使用加密哈希作爲文件名,還是必須先將其轉換?

我的問題:是,所有的C++ hashers/crypters我所遇到的哈希的std :: string或字符* &返回散列字符串作爲無符號字符*

如何將該unsigned char *轉換爲char *或std :: string,然後將其寫入文件或文件名?或者我不需要將其轉換爲普通字符串來使用它?

tstring hashString(tstring str) 
{ 
    // Post: 

    unsigned char hashStr[SHA256_DIGEST_SIZE]; 
    std::string messageStr = str; 

    SHA256::getInstance()->digest(messageStr, hashStr); 
    //TCHAR *hashStrSigned = reinterpret_cast <TCHAR*>(hashStr); 

    // can I just use this hashStr to create a file? Or do I have to convert it to char* to use? 

    Handle newF = CreateFile((LPTSTR)hashStr, GENERIC_ALL, 0, NULL, CREATE_ALWAYS, 
           0, NULL); 

    return tstring(hashStrSigned); 
} 

回答

4

散列的結果可能包含映射到文件名中不允許的字符的字節(例如null-char,'+','?'等....)。所以你的代碼中的「hashStr」不可能是一個字符串,而只是一個非空終止的字節數組。

試試這個小功能,從轉換「二進制散列適合於文件名字符串」

void HashToString(unsigned char* shaHash, std::string* pStr) 
{ 
    char szHash[SHA256_DIGEST_SIZE*2+1]; 
    char* pszOut = szHash; 

    for (int x = 0; x < SHA256_DIGEST_SIZE; x++) 
    { 
     sprintf(pszOut, "%.2X", shaHash[x]); // write out as hex chars 
     pszOut += 2; // advance 2 chars 
    } 
    *pszOut = '\0'; // null terminate 

    *pStr = std::string(szHash); 
} 

在你上面的代碼示例,你會打電話來,如下所示:

std::string str; 
HashToString(hashStr, &str); 
HANDLE newF = CreateFileA(str.c_str(), ...); 
+0

散列庫可能有一個「hexdigest」函數,你可以調用它來代替「摘要」,它會給你十六進制字符。然後,所有真正需要的是轉換爲'std :: string'的最後一行,儘管您可能還需要與編譯器討論'unsigned char *'和'char *'之間的區別。如果是這樣,最好做'std :: string(hexHash,hexHash + SHA256_HEXDIGEST_SIZE]);' –

相關問題