📄 xcrc.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 + -