c++ 字符串加密函数,请问一下大家为什么会这样?小弟我很菜,不要笑

c++ 字符串加密函数,请教一下大家为什么会这样?我很菜,不要笑。
我程序的一个加密字符串函数
CString CFileEncryptorDlg::SHA1(CString &inData)
{
CString outData;
HCRYPTPROV hProv = 0;
HCRYPTHASH hHash = 0;
BYTE bHash[32];
DWORD dwHashLen = 20; // The SHA1 algorithm always returns 20 bytes. 
DWORD cbContent = inData.GetLength(); 
BYTE* pbContent = (BYTE*)inData.GetBuffer(cbContent);//这里老是说错误的指针,不知道是不是错了

if(!CryptAcquireContext(&hProv, NULL,MS_DEF_PROV,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT))
    return _T("");
if(!CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash))
    return _T("");
if(!CryptHashData(hHash, pbContent, cbContent, 0))
    return _T("");
if(!CryptGetHashParam(hHash, HP_HASHVAL, bHash, &dwHashLen, 0))
    return _T("");

CString tmp; 
for (unsigned int i = 0; i < dwHashLen; i += 4) { 
    tmp.Format(_T("%02x%02x%02x%02x"), bHash[i], bHash[i+1],bHash[i+2],bHash[i+3]); 
    outData += tmp; 
}

if(hHash)
    CryptDestroyHash(hHash); 
if(hProv)
    CryptReleaseContext(hProv, 0);

return outData;
}

使用的时候,我传一个时间进去
CString m_strTime;
CTime time = CTime::GetCurrentTime(); ///构造CTime对象
m_strTime = time.Format("%Y%m%d%H%M%S");
SetDlgItemText(IDC_EDIT_HASH, SHA1(m_strTime));//显示给控件

结果好奇怪
c++ 字符串加密函数,请问一下大家为什么会这样?小弟我很菜,不要笑
虽然我感觉觉得是0的问题,好像只要没有0,就会变成正常,但我不能去掉0的啊,如何处理呢,请大家帮我看看
------解决思路----------------------
引用:
Quote: 引用:

把这两行修改一下:
DWORD cbContent = inData.GetLength() * sizeof(TCHAR); 
BYTE *pbContent = (BYTE *)(LPCTSTR)inData;

正解。能说说为什么你这样就行,我的就会出错的原因吗?分给你了
1. 计算 Hash 都是要传总字节数的,而 GetLength 返回的是字符数。
2. 将 inData 转换为 LPCTSTR (操作符重载),得到字符串指针,然后强转为 BYTE * 即可,不需要 GetBuffer。不过效果相同,但你 GetBuffer 后还得需要一个 ReleaseBuffer 。
当然,计算字符串的 Hash 值,项目设置为 MBCS 和 Unicode 的结果肯定是不同的,因为其字节内容和长度都不同。