同样的一代码,在VC6中可以使用,在VS.net2005中出错。。。。。。。MD5String函数

怀柔老纪 2008-02-28 03:11:48
char* MD5String( char *string )
{
MD5_CTX context;
unsigned char digest[16];
char output1[33];
static char output[33]={""};
unsigned int len = strlen (string);
int i;

MD5Init( &context);
MD5Update( &context, (unsigned char*)string, len );
MD5Final( digest, &context );

for (i = 0; i < 16; i++)
{
sprintf(&(output1[2*i]),"%02x",(unsigned char)digest[i]);
sprintf(&(output1[2*i+1]),"%02x",(unsigned char)(digest[i]<<4));
}
for(i=0;i<32;i++)
{
output[i]=output1[i];
}
return output; //这里出错,在VC6中不出错,在VS.net2005中的C++中出错,提示是:Run-Time Check Failure #2 - Stack around the variable 'output1' was corrupted
}

我所用的调用这个函数的代码是:
UpdateData(TRUE);
CString mTmp;
char* pTmp;

pTmp = MD5String((char *)(LPCTSTR)m_inStr); //m_inStr 是输入Edit控件Value变量

m_outStr = (CString)pTmp;//m_outStr是输出Edit控件的Value变量
UpdateData(FALSE);
...全文
93 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
怀柔老纪 2008-03-06
  • 打赏
  • 举报
回复
是static声明的原因,在VC6和VC.net的不同处理方式造成的

只要改动一下参数,把返回的方式改为var 参数就好了
my_girlf 2008-03-03
  • 打赏
  • 举报
回复
可能是MD5String中output1的问题,把char output1[33];改为char output1[34];
my_girlf 2008-02-28
  • 打赏
  • 举报
回复
调用的问题。
char* pTmp = new char[33];
memset(pTmp,0,33);
pTmp = MD5String((char *)(LPCTSTR)m_inStr);
这样就可以了。
最后delete pTmp;
aa3000 2008-02-28
  • 打赏
  • 举报
回复
for (i = 0; i < 16; i++)
{
sprintf(&(output1[2*i]),"%02x",(unsigned char)digest[i]);
sprintf(&(output1[2*i+1]),"%02x",(unsigned char)(digest[i] < <4));
}

越界了。其实这样就行了:

for (i = 0; i < 16; i++)
{
sprintf(&(output1[2*i]),"%02x",(unsigned char)digest[i]);
}
菜牛 2008-02-28
  • 打赏
  • 举报
回复
你把output设大一些,一倍。

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧