原文网址:http://blog.163.com/fsd999999@126/blog/static/37737825201051033543633/
很多网络协议都用到CRC校验码,当自己编写网络协议的时候,也需要编写相应的CRC代码,来进行校验,网上有很多类似的代码,但是有些很麻烦,也不一定高效,我现在提供一个很高效,也很容易理解的CRC校验方法,希望能够对大家有所帮助。
int calcByte(int crc, char b)//这个函数是用来进行位运算的,主要为下面的计算CRC来服务
{
int i;
crc = crc ^ (int)b << 8;
for ( i = 0; i < 8; i++)
{
if ((crc & 0x8000) == 0x8000)
crc = crc << 1 ^ 0x1021;
else
crc = crc << 1;
}
return crc & 0xffff;
}
//count crc-16, length in byte
//这个函数是计算16位CRC码的函数,只要给出要校验的数组,以及数组长度,就可以返回16位CRC校验码
int CRC16(char *pBuffer, int length)
{
int wCRC16=0;
int i;
if (( pBuffer==0 )||( length==0 ))
{
return 0;
}
for ( i = 0; i < length; i++)
{
wCRC16 = calcByte(wCRC16, pBuffer[i]);
}
return wCRC16;
}
//下面这个函数是计算32位CRC码的函数,传入参数是数组,以及校验的数据数量,返回32位的CRC校验码
long CRC32(char* pBuffer, long length)
{
long dwCRC32=0;
if ((NULL == pBuffer)||(0 == length))
{
return 0;
}
for (int i = 0; i < length; i++)
{
dwCRC32 -= *pBuffer++;
}
return dwCRC32;
}
/************************
crc校验码的使用是这样的:当要发送数据的时候,把要发送的进行CRC校验,然后把这些数据连同CRC校验码一起发送给接收方,当接收方收到数据的时候,把收到的数据重新计算一下CRC校验码,然后跟收到的CRC校验码进行比较,如果相同,就证明接收正确,如果不一样,那么就要求发送方重新发送一下这个数据。经验表明,计算16位的CRC校验码的那个代码很受欢迎。我在下一篇日志中,将用C语言写一个计算CRC校验码的例子,并采用交互式的方法,输出结果。
******************************/