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;
}原文:http://blog.csdn.net/adream307/article/details/44132313