码迷,mamicode.com
首页 > 其他好文 > 详细

查找表实现的CRC16

时间:2015-03-08 13:03:32      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:

http://www.w3.org/TR/PNG/#D-CRCAppendix

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>

/*
 * CRC16查找表生成
 * table[256] : 存放查找表的数组
 * Generator : 生成多项式,X^16+X^12+X^5+1,其生成多项式为0x1021
 */
void crc16_make_table(u_int16_t table[256],const u_int16_t Generator)
{
	u_int16_t c;
	int i,j,t1;
	for(i=0; i<256; ++i)
	{
		c = 0xFFFF & (i << 8);
		for(j=0; j<8; ++j)
		{
			t1 = c & 0x8000;
			c <<= 1;
			if(t1!=0) c ^= Generator;
		}
		table[i] = c;
	}
}

/*
 * CRC16校验   
 * table : crc16_make_table生成的查找表
 * Generator : 生成多项式,X^16+X^12+X^5+1,其生成多项式为0x1021
 * buf : 校验数据
 * start : 数据起始位置
 * length : 数据长度
 * 返回值 : CRC16校验结果
*/
u_int16_t crc16_update(const u_int16_t *table, u_int16_t Initial, const u_int8_t *buf, const int start, const int length)
{
	u_int8_t b;
	int i;
	for(i=start; i<start+length; ++i)
	{
		b = (u_int8_t)(0xFF & (Initial >> 8));
		b ^= buf[i];
		Initial = 0xFF00 & (Initial << 8);
		Initial ^= table[b];
	}
	return Initial;
}

/*
 * CRC16校验   
 * Initial : 存器初值
 * Generator : 生成多项式,X^16+X^12+X^5+1,其生成多项式为0x1021
 * buf : 校验数据
 * start : 数据起始位置
 * length : 数据长度
 * 返回值 : CRC16校验结果
*/
u_int16_t crc_16(u_int16_t Initial,const u_int16_t Generator,const u_int8_t *buf,const int start, const int length)  
{
	int i,j,t0,t1;
	u_int8_t b;
	for (i = start; i < start + length; ++i)  
	{  
		b = buf[i];  
		for (j = 0; j < 8; ++j)  
		{  
			t0 = b & 0x80;  
			t1 = Initial & 0x8000;  
			Initial <<= 1;  
			b <<= 1;  
			if (t0 != 0) Initial += 1;  
			if (t1 != 0) Initial ^= Generator;  
		}  
	}  
	for (i = 0; i < 16; ++i)  
	{  
		t1 = Initial & 0x8000;  
		Initial <<= 1;
		if (t1 != 0) Initial ^= Generator;  
	}  
	return Initial;  
}

int main()
{
	int i;
	u_int16_t crc16;
	u_int8_t buf[256];
	u_int16_t crc16_table[256];
	
	for(i=0; i<256; ++i) buf[i]=(u_int8_t)(i&0xFF);
	crc16=crc_16(0,0x1021,buf,0,256);
	printf("crc_16()=%04X\n",crc16); //0x7E55
	
	crc16_make_table(crc16_table,0x1021);
	crc16=crc16_update(crc16_table,0,buf,0,256);
	printf("crc16_update()=%04X\n",crc16);  //0x7E55
	
	return 0;
}


查找表实现的CRC16

标签:

原文地址:http://blog.csdn.net/adream307/article/details/44132313

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!