1

我正在尝试散列一个字符串,然后使用该散列作为文件名。

我的问题:我遇到的所有 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);
}
4

1 回答 1

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(), ...);
于 2011-10-18T06:42:43.153 回答