C++ 由六角管柱形成管柱

C++ 由六角管柱形成管柱,c++,openssl,sha1,ofstream,C++,Openssl,Sha1,Ofstream,我试图通过读取文件内容来创建文件的散列,然后使用SHA1对其进行散列,之后我尝试使用此散列值创建一个文件名,但问题只涉及散列字符串的前两个字符。 散列函数 void hash(const std::string& content, std::string& retValue, bool isFile) { SHA_CTX ctx; SHA1_Init(&ctx); SHA1_Update(&ctx, content.c_str(), con

我试图通过读取文件内容来创建文件的散列,然后使用
SHA1
对其进行散列,之后我尝试使用此散列值创建一个文件名,但问题只涉及散列字符串的前两个字符。 散列函数

void hash(const std::string& content, std::string& retValue, bool isFile)
{
    SHA_CTX ctx;
    SHA1_Init(&ctx);
    SHA1_Update(&ctx, content.c_str(), content.size());
    if (isFile) {
        FILE* f = fopen(content.c_str(),"r");
        assert(f != NULL);
        char buffer[1024]={0};
        while(fgets(buffer,1024,f))
            SHA1_Update(&ctx,buffer,strlen(buffer));
        fclose(f);
    }

    unsigned char hash[SHA_DIGEST_LENGTH] = {0};
    SHA1_Final(hash,&ctx);
    retValue.resize(60);
    int cnt = 0;
    for(int i=0;i<SHA_DIGEST_LENGTH;i++){
        char ch[3] = {0};
        sprintf(ch,"%02x",hash[i]);
        retValue[cnt++] = ch[0];
        retValue[cnt++] = ch[1];
        retValue[cnt++] = ch[2];
    }
    std::cout<<retValue<<std::endl;
}

下面是一个略短的版本,它也做了同样的事情:

for(int i=0;i<SHA_DIGEST_LENGTH;i++){
        sprintf(retValue + cnt,"%02x",hash[i]);
        cnt += 2;
    }

for(int i=0;i
retValue[cnt++]=ch[2];
这会在每两个十六进制字符后复制
'\0'
nul终止符。但是您只希望nul终止符位于字符串的最末尾。负面投票者应该评论他们在这篇文章中发现了什么,所以我不再重复。谢谢you@dxiv好吧,让我试试that@dxiv谢谢你的评论,它解决了我的问题:)
for(int i=0;i<SHA_DIGEST_LENGTH;i++){
        sprintf(retValue + cnt,"%02x",hash[i]);
        cnt += 2;
    }