1

文字列をハッシュして、そのハッシュをファイルの名前として使用しようとしています。

私の問題:私が遭遇したすべてのC ++ハッシャー/クリプターは、std ::stringまたはchar*をハッシュし、ハッシュされた文字列をunsigned char *として返すということですか?

そのunsignedchar*を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」は文字列ではなく、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(), ...);
于 2011-10-18T06:42:43.153 に答える