⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xcrc.cpp

📁 BCB的学习资料
💻 CPP
字号:
//---------------------------------------------------------------------------


#pragma hdrstop

#include "XCRC.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)
namespace zdhsoft
{
XInt XCRC::m_crcTable32[256];     //crc32表
XInt XCRC::m_crcTable16[256];     //crc16表

/*
////////////////////////////////////////////////////////////////////////////////
[Name]initTable32
[Title]初始化CRC32表
////////////////////////////////////////////////////////////////////////////////
[Description]
    如果这个表,在操作之前,没有被初始化,那么就进行初始化
[Version]2.0
[Author] Rex Winter
[Data]2004-12-13
////////////////////////////////////////////////////////////////////////////////
*/
void XCRC::initTable32()
{
    static bool bNotInit = true;
    if( bNotInit )
    {
        bNotInit = false;
        XInt crc_accum;
        for(int i=0; i<256; i++)
        {
            crc_accum = (i << 24);
            for(int j=0; j<8; j++)
            {
                if( (crc_accum & 0x80000000)!=0)
                {
                    crc_accum = ( crc_accum << 1 ) ^ 0x04c11db7;
                }
                else
                {
                    crc_accum = ( crc_accum << 1 );
                }
            }
            m_crcTable32[i] = crc_accum;
        }
    }
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]initTable16
[Title]初始化CRC16表
////////////////////////////////////////////////////////////////////////////////
[Description]
    如果这个表,在操作之前,没有被初始化,那么就进行初始化
[Version]1.0
[Author] Rex Winter
[Data]2005-6-25
////////////////////////////////////////////////////////////////////////////////
*/
void XCRC::initTable16()
{
    static bool bNotInit = true;
    if( bNotInit )
    {
        bNotInit = false;
        XWord crc_accum;
        for(int i=0; i<256; i++)
        {
            crc_accum =(XWord)(i << 8);
            for(int j=0; j<8; j++)
            {
                if( (crc_accum & 0x8000)!=0)
                {
                    crc_accum =(XWord)(( crc_accum << 1 ) ^ 0x8005);
                }
                else
                {
                    crc_accum = (XWord)( crc_accum << 1 );
                }
            }
            m_crcTable16[i] = crc_accum;
        }
    }
}
//生成取并得CRC32的值
/*
////////////////////////////////////////////////////////////////////////////////
[Name]CRC32
[Title]取CRC32的值
////////////////////////////////////////////////////////////////////////////////
[Param]
    <const XByte *> data 将要生成CRC32的源数据
    <int>size 源数据的字节数
[Return]
    <XDWord>返回生成的CRC32值 
[Description]
    根据指定的数据源,生成一个CRC32
[Version]2.1
[Author] Rex Winter
[Data]2005-6-24
////////////////////////////////////////////////////////////////////////////////
*/
XDWord XCRC::CRC32(const void * data,int size)
{
    initTable32();
    const XByte * srcdata = (const XByte *)data;
    XDWord crc = 0xffffffff;
    if(size <= 0) return crc;
    int len = size;
    for(int i=0;i<len;i++)
    {
      crc = (crc << 8) ^ m_crcTable32[((crc >> 24) ^ (*srcdata++)) & 0xff];
    }
    return crc;
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]CRC32
[Title]取CRC32的值
////////////////////////////////////////////////////////////////////////////////
[Param]
    <const XArray<XByte> &> data 将要生成CRC32的字节数组
[Return]
    <XDWord>返回生成的CRC32值 
[Description]
    根据指定的字节数组,生成一个CRC32
[Version]2.1
[Author] Rex Winter
[Data]2005-6-24
////////////////////////////////////////////////////////////////////////////////
*/
XDWord XCRC::CRC32(const XArray<XByte> & data)
{
    return CRC32(data.Data(),data.GetLength());
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]CRC32
[Title]取CRC32的值
////////////////////////////////////////////////////////////////////////////////
[Param]
    <const XDynamicArray<XByte> &> data 将要生成CRC32的动态字节数组
[Return]
    <XDWord>返回生成的CRC32值 
[Description]
    根据指定的动态字节数组,生成一个CRC32
[Version]2.1
[Author] Rex Winter
[Data]2005-6-24
////////////////////////////////////////////////////////////////////////////////
*/
XDWord XCRC::CRC32(const XDynamicArray<XByte> &data)
{
    return CRC32(data.Data(),data.GetLength());
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]CRC32
[Title]取CRC32的值
////////////////////////////////////////////////////////////////////////////////
[Param]
    <const XDynamicArray<XByte> &> data 将要生成CRC32的字节缓冲区
[Return]
    <XDWord>返回生成的CRC32值 
[Description]
    根据指定的字节缓冲区,生成一个CRC32
[Version]2.1
[Author] Rex Winter
[Data]2005-6-24
////////////////////////////////////////////////////////////////////////////////
*/
XDWord XCRC::CRC32(const XByteBuffer & data)
{
    return CRC32(data.Data(),data.GetLength());
}

//生成取并得CRC16的值
/*
////////////////////////////////////////////////////////////////////////////////
[Name]CRC16
[Title]取CRC16的值
////////////////////////////////////////////////////////////////////////////////
[Param]
    <const XByte *> data 将要生成CRC32的源数据
    <int>size 源数据的字节数
[Return]
    <XWord>返回生成的CRC16值
[Description]
    根据指定的数据源,生成一个CRC16
[Version]1.0
[Author] Rex Winter
[Data]2005-6-25
////////////////////////////////////////////////////////////////////////////////
*/
XWord XCRC::CRC16(const void * data,int size)
{
    initTable16();
    const XByte * srcdata = (const XByte *)data;
    XWord crc = 0;
    if( size <=0 ) return crc;
    for(int i=0;i<size;i++)
    {
        crc =(XWord)(( crc << 8 ) ^ m_crcTable16[ (( crc >> 8 ) ^ (*srcdata++)) & 0xff]);
    }
    return crc;
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]CRC16
[Title]取CRC16的值
////////////////////////////////////////////////////////////////////////////////
[Param]
    <const XArray<XByte> &> data 将要生成CRC16的字节数组
[Return]
    <XWord>返回生成的CRC16值
[Description]
    根据指定的字节数组,生成一个CRC16
[Version]1.0
[Author] Rex Winter
[Data]2005-6-25
////////////////////////////////////////////////////////////////////////////////
*/
XWord XCRC::CRC16(const XArray<XByte> & data)
{
    return CRC16(data.Data(),data.GetLength());
/*
////////////////////////////////////////////////////////////////////////////////
[Name]CRC16
[Title]取CRC16的值
////////////////////////////////////////////////////////////////////////////////
[Param]
    <const XDynamicArray<XByte> &> data 将要生成CRC16的字节数组
[Return]
    <XWord>返回生成的CRC16值
[Description]
    根据指定的字节数组,生成一个CRC16
[Version]1.0
[Author] Rex Winter
[Data]2005-6-25
////////////////////////////////////////////////////////////////////////////////
*/
}
XWord XCRC::CRC16(const XDynamicArray<XByte> &data)
{
    return CRC16(data.Data(),data.GetLength());
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]CRC16
[Title]取CRC16的值
////////////////////////////////////////////////////////////////////////////////
[Param]
    <const XByteBuffer &> data 将要生成CRC16的字节缓冲区
[Return]
    <XWord>返回生成的CRC16值
[Description]
    根据指定的字节数组,生成一个CRC16
[Version]1.0
[Author] Rex Winter
[Data]2005-6-25
////////////////////////////////////////////////////////////////////////////////
*/
XWord XCRC::CRC16(const XByteBuffer & data)
{
    return CRC16(data.Data(),data.GetLength());
}

}//end of namespace zdhsoft

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -