请大家帮我测试一下这个函数,其中pszPassword用“j312608"测试,看返回值是多少,请贴出返回值,谢谢!char * EncryptPassword(const char* pszPassword)
{
char sz[50] = {0};
         char pszRet[50]={0}; sprintf(sz, "fetion.com.cn:%s", pszPassword);

char hashPWD[20] = {0};
CUtils::SHA(sz, hashPWD); for(int i=0; i<20; i++)
sprintf(pszRet, "%s%02X", pszRet, *(unsigned char*)&hashPWD[i]); return pszRet;
}

解决方案 »

  1.   

    结果就是hashPWD数组从0到19的02X表示的连接起来的字符串不过你用局部变量pszRet作为返回值是不对的,函数返回后这个地址已经还给系统了,你再使用就有问题了
      

  2.   

    请大家帮我测试一下这个函数,其中pszPassword用“j312608"测试,看返回值是多少,请贴出返回值,谢谢!
    ============
    一个错误的函数,返回局部变量的指针,结果是不确实的,在某些情况下能正确工作,某些情况下不能正常工作。没有测试的价值。
      

  3.   

    改成如下方式,帮测试一下,我手头没有VC,谢谢!char pszRet[50]={0};void  EncryptPassword(const char* pszPassword,char *pszRet)
    {
        char sz[50] = {0};
     
        sprintf(sz, "fetion.com.cn:%s", pszPassword);
        
        char hashPWD[20] = {0};
        CUtils::SHA(sz, hashPWD);    for(int i=0; i<20; i++)
            sprintf(pszRet, "%s%02X", pszRet, *(unsigned char*)&hashPWD[i]); }
      

  4.   

    B0 5B 83 70 0A 8B 80 5F 87 E3 B9 73 E0 82 DA CD 82 C4 B3 13 
      

  5.   


    这一句怎么理解?是不是%s处取pszRet的值,%02x处取*(unsigned char*)&hashPWD[i]的值重新构成新的pszRet?作用是什么?
    for(int i=0; i<20; i++)
            sprintf(pszRet, "%s%02X", pszRet, *(unsigned char*)&hashPWD[i]);
      

  6.   

    对的,不过
    %02x处取*(unsigned char*)&hashPWD[i]值的16进制表示,不足两位在前面补0
      

  7.   


    其中pszPassword是用“j312608"测试的不?
      

  8.   


    另外,下面的语句是不是将hashPWD变为16进制后存到pszRet中?
    for(int i=0; i<20; i++)
      sprintf(pszRet, "%s%02X", pszRet, *(unsigned char*)&hashPWD[i]);