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

来源:互联网 发布:last game 软件 编辑:程序博客网 时间:2024/05/02 00:27
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;
}
0 0