gpt4 book ai didi

c++ - 我可以使用加密哈希作为文件名还是必须先转换它?

转载 作者:行者123 更新时间:2023-11-30 02:07:29 32 4
gpt4 key购买 nike

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

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

最佳答案

散列的结果可能包含映射到文件名中不允许的字符的字节(例如空字符、'+'、'?' 等....)。因此,您代码中的“hashStr”不太可能是一个字符串,而只是一个不以 null 结尾的字节数组。

试试这个小函数,将“二进制散列转换为适合文件名的字符串”

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(), ...);

关于c++ - 我可以使用加密哈希作为文件名还是必须先转换它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7803280/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com