CRC是一种排错检查方式,该演算法的标准由
CCITT所指定,至少可检测到99.998%的已知错误。指定文件交由cksum演算,它会回报计算结果,供用户核对文件是否正确无误。
功能说明
检查文件的CRC是否正确。
语法
补充说明
terCRC32用于CRC32的计算。
#define CRCCCITT 0x1021
#define CCITT-REV 0x8408
#define CRC16 0x8005
#define CRC16-REV 0xA001
#define CRC32-POLYNOMIAL 0xEDB88320L
/* 以上为CRC除数的定义 */
#define NIL 0
#define crcupdate(d,a,t)*(a)=(*(a)<<8)^(t)[(*(a)>>8)^(d)];
#define crcupdate16(d,a,t)*(a)=(*(a)>>8^(t)[(*(a)^(d))&0x00ff])
/* 以上两个宏可以代替函数crcupdate和crcrevupdate */
#include #include #include /* 函数crchware是传统的CRC算法,其返回值即CRC值 */ unsigned short crchware(data,genpoly,accum)
unsigned short data;/* 输入的数据 */
unsigned short genpoly;/* CRC除数 */
unsigned short accum;/* CRC
累加器值 */
{
static int i;
data<<=8;
for(i=8;i>0;i--)
{
if((data^accum)&0x8000)
accum=(accum<<1)^genpoly;
else
accum<<=1;
data<<=1;
}
return (accum);
}
/* 函数mk-crctbl利用函数crchware建立内存中的CRC数值表 */
unsigned short *mk-crctbl(poly,crcfn);
unsigned short poly;/* CRC除数--CRC生成多项式 */
R>unsigned short (*crcfn)();/* 指向CRC函数(例如crchware)的
指针 */
{
/* unsigned short */malloc(); */
unsigned short *crctp;
int i;
if((crctp=(unsigned short*)malloc(256*sizeof(unsigned)))==0)
return 0;
for(i=0;i<256;i++)
crctp=(*crcfn)(i,poly,0);
return crctp;
}
/* 函数mk-crctbl的使用范例 */
if((crctblp=mk-crctbl(CRCCCITT,crchware))==NIL)
{
return 1; */
/* 函数crcupdate用以用查表法计算CRC值并更新CRC
累加器值 */
void crcupdate(data,accum,crctab)
unsigned short data;/* 输入的数据 */
unsigned short *accum;/* 指向CRC
累加器的
指针 */
unsigned short *crctab;/* 指向内存中CRC表的
指针 */
{
static short comb-val;
comb-val=(*accum>>8)^data;
*accum=(*accum<<8)^crctab[comb-val];
}
/* 函数crcrevhware是传统的CRC算法的反序算法,其返回值即CRC值 */
unsigned short crcrevhware(data,genpoly,accum)
unsigned short data;
unsigned short genpoly;
unsigned short accum;
{
static int i;
data<<=1;
for(i=8;i>0;i--)
{
data>>=1;
if((data^accum)&0x0001)
accum=(accum>>1)^genpoly;
else
accum>>=1;
}
return accum;
}
/* 函数crcrevupdate用以用反序查表法计算CRC值并更新CRC
累加器值 */
void crcrevupdate(data,accum,crcrevtab)
unsigned short data;
unsigned short *accum;
参数
--help 在线帮助。
--version 显示版本信息。