您的位置:首页 > 编程语言 > C语言/C++

CRC32直接计算法计算字符串校验值示例(VC++)

2013-12-26 16:14 176 查看
int CCRC32TestDlg::getCRC32(CString data)

{

CString strData = data;

wchar_t* pData = strData.GetBuffer();

wchar_t c;

_int64 POLY = 0x04c11db7;

_int64 regi = 0x0;

//regi包含64位,使用中间的32位(即低第17位到48位)作为运算区域,低16位作为数据缓存区(Unicode字符,每个字符占用16位)

//POLY左移16位,与regi运算区域对齐

POLY <<= 16;

_int64 top_remove = 0x0001000000000000;//用于测试第49位是否为1

int i ;

c = *pData++;

regi |= c;//装载一个字符到缓存区

regi <<= 16;//从缓存区移到运算区低16位

c = *pData++;

if(c != '\0')//c == '\0'意味着整个字符串只有一个字符

{

regi |= c;//装载一个字符到缓存区

regi <<= 16;//运算区现在保存了2个字符

while(true)

{

c = *pData++;

if(c == '\0')

{

break;

}

else

{

regi |= c;//载入字符到缓存区

}

for(i = 0; i < 16; i++)

{

regi <<= 1;

if( (regi & top_remove) == top_remove)//测试刚移出运算区的是否为1

{

regi ^= POLY;

}

}

}

}

for(i=0;i<16;i++)

{

regi <<= 1;

if( (regi & top_remove) == top_remove)

{

regi ^= POLY;

}

}

//处理结果

i = regi>>16;

CString str;

str.Format(_T("%x"),i);//16进制显示

AfxMessageBox(str);

return i;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: