搜索
bottom↓
回复: 4

[C++源码]CRC计算类

[复制链接]

出200入2554汤圆

发表于 2011-7-26 08:43:39 | 显示全部楼层 |阅读模式
查表法计算字节流、文件的CRC32值,使用了C++类封装;

现贴出来与大家分享下:)

点击此处下载 ourdev_661097ZILPGF.rar(文件大小:1K) (原文件名:CRC32.rar)

//-------------------------------------- 华丽的分割线 --------------------------------------------

// CRC32.h: interface for the CRC32 class.
//
//////////////////////////////////////////////////////////////////////

#pragma once

class CRC32  
{
public:
    CRC32();
    ~CRC32();

// CRC32表格
private:
    unsigned __int32 m_crc32Table[256];

// 对外接口
public:
    unsigned __int32 GetCRC32(void *pData, long dwLen);
    unsigned __int32 GetCRC32(LPCTSTR szFileName);
};



//-------------------------------------- 飘逸的分割线 --------------------------------------------

// CRC32.cpp: implementation of the CRC32 class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "CRC32.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CRC32::CRC32()
{
    // 初始化CRC32表格
    int i,j;
    unsigned __int32 crc;

    for(i=0;i<256;i++)
    {
        crc=i;
        for(j=0;j<8;j++)
        {
            if(crc &1)
                crc= (crc>>1) ^ 0xEDB88320;
            else
                crc>>=1;
        }
        m_crc32Table=crc;
    }
}

CRC32::~CRC32()
{

}

//////////////////////////////////////////////////////////////////////
// Interface
//////////////////////////////////////////////////////////////////////

/* 计算长度为 dwLen 字节 pData 字节串的CRC32值 */
unsigned __int32 CRC32::GetCRC32(void *pData, long dwLen)
{
    unsigned __int32 crc  = 0xFFFFFFFF;
    unsigned __int8  *buffer= (unsigned __int8*)pData;

    for(long i=0;i<dwLen;i++)
    {
        crc= (crc>>8) ^ m_crc32Table[ (crc&0xFF)^buffer ];
    }

    return crc^0xFFFFFFFF;
}

/* 计算路径名为 szFileName 文件的CRC32值 */
unsigned __int32 CRC32::GetCRC32(LPCTSTR szFileName)
{
    unsigned __int32 crc  = 0xFFFFFFFF;
    unsigned __int32 i,nRead;
    unsigned __int8 buffer[1024];

    CFile file;
    if(FALSE==file.Open(szFileName, CFile::modeRead|CFile::typeBinary))
    {
        AfxMessageBox(_T("文件打开失败"));
        return 0x00000000;
    }

    nRead= file.Read(buffer,1024);
    while(nRead>0)
    {
        for(i=0; i<nRead; i++)
        {
            crc= (crc>>8) ^ m_crc32Table[ (crc&0xFF)^buffer ];
        }
        nRead= file.Read(buffer,1024);
    }
    file.Close();

    return crc^0xFFFFFFFF;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-7-27 19:12:09 | 显示全部楼层
下载不了

出0入0汤圆

发表于 2011-7-27 20:09:27 | 显示全部楼层
研究下!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-24 07:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表