2024-06-23 17:36:53 +08:00

84 lines
2.5 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "stdafx.h"
/********************************************************************
created: 2004/03/15
created: 15:3:2004 17:09
filename: e:\p_work\test\crc.h
file path: e:\p_work\test
file base: crc
file ext: h
purpose: 处理CRC循环校验所需要的方法可选择临时计算
或者一次计算出数值查表以增加速度.
*********************************************************************/
class CCRC
{
public:
CCRC()
{
}
virtual ~CCRC()
{
}
public:
#define CRC16_CCITT 0x1021
#define CRC16_DEFAULT 0x8005
#define CRC32_DEFAULT 0x04C10DB7
/*******************************************************************/
/*
函 数 名 称: RunCRC16
功 能 描 述: 执行对数据段的CRC16循环冗余校验
参 数 说 明: aData[in]:待校验数据
aSize[in]:待校验数据长度
aPoly[in]:创建表所需要的多项式
返回值 说明: 循环冗余校验结果
/*******************************************************************/
static unsigned short RunCRC16( const char * aData, unsigned long aSize, unsigned short aPoly );
/*******************************************************************/
/*
函 数 名 称: RunCRC32
功 能 描 述: 执行对数据段的CRC32循环冗余校验
参 数 说 明: aData[in]:待校验数据
aSize[in]:待校验数据长度
aPoly[in]:创建表所需要的多项式
返回值 说明: 循环冗余校验结果
/*******************************************************************/
static unsigned long RunCRC32( const char * aData, unsigned long aSize, unsigned long aPoly );
};
/*
CRC算法简介
RC校验的基本思想是利用线性编码理论在发送端根据要传送的k位二进制码序列
以一定的规则产生一个校验用的监督码既CRC码r位并附在信息后边构成
一个新的二进制码序列数共(k+r)位,最后发送出去。在接收端,则根据信息码和
CRC码之间所遵循的规则进行检验以确定传送中是否出错。
16位的CRC码产生的规则是先将要发送的二进制序列数左移16位既乘以 )后,再
除以一个多项式最后所得到的余数既是CRC码如式2-1式所示其中B(X)表
示n位的二进制序列数G(X)为多项式Q(X)为整数R(X)是余数既CRC码
2-1 求CRC码所采用模2加减运算法则既是不带进位和借位的按位加减这种加
减运算实际上就是逻辑上的异或运算,加法和减法等价,乘法和除法运算与普通代数
式的乘除法运算是一样符合同样的规律。生成CRC码的多项式如下其中CRC-16和
CRC-CCITT产生16位的CRC码而CRC-32则产生的是32位的CRC码.
CRC-16美国二进制同步系统中采用
CRC-CCITT由欧洲CCITT推荐
CRC-32
接收方将接收到的二进制序列数包括信息码和CRC码除以多项式如果余数为0
则说明传输中无错误发生,否则说明传输有误,关于其原理这里不再多述。用软件
计算CRC码时接收方可以将接收到的信息码求CRC码比较结果和接收到的CRC码是否相同。
*/