我正在尝试散列字符串,然后使用该散列作为文件的名称。
我的问题:是我遇到的所有C ++哈希/加密哈希std :: string或char *&将散列字符串作为 unsigned char * ?
返回如何将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);
}
答案 0 :(得分: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(), ...);