⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crc16.cpp

📁 用c实现一种实现并计算16位crc的方法
💻 CPP
字号:
/********************************************************************************\
**功能:实现16位的CRC的计算,输入为一个一个字节的数据和数据的字节数
**      输出数据包括数据和16位的CRC码,与CRC8的区别是传递参数时不
**      要生成多项式最高位的1传递过去
**作者:田玉利
**修改日期         人员           版本               原因
**20090217        田玉利          1.0                创建
********************************************************************************/

#include <stdafx.h>
#include <stdio.h>

int crctable_16[256] ;
unsigned short getcrc_16(unsigned short *pdata, int nlength) ;
void mk_crctable(unsigned short genpoly) ;

void main()
{
	unsigned short crc_16 ;
	unsigned short genpoly = 0x1021 ;
    unsigned short *pdata ;
	unsigned short data = 0x11 ;
	int nlength = 1 ;

	pdata = &data ;
	mk_crctable ( genpoly ) ;
	crc_16 = getcrc_16(pdata, nlength) ;
    printf( " the crc_16 of %d is %0x\n ", *pdata, crc_16 ) ;

}

unsigned short getcrc_16(unsigned short *pdata, int nlength)
//函数功能:计算数据流* pdata的16位CRC校验码,数据流长度为nlength
{
    unsigned short crc_16 = 0x0000;    // 初始化
    char *bdata ;            //字符型可以保证每次取一个字节的数据
	bdata =(char*)pdata +nlength-1 ;
    while(nlength>0)
    {
        crc_16 = (crc_16 << 8) ^ crctable_16[((crc_16>>8) ^ *bdata) & 0xff]; //crctable_16表由函数mk_crctable生成
        nlength--;
        bdata--;       //指向下一个字节
    }

    return crc_16;
}

void mk_crctable(unsigned short genpoly)
//函数功能:生成0-255对应的16CRC校验码,其实就是计算机算法1(比特型算法)
//genpoly为生成多项式
//注意,低位先传送时,生成多项式应反转(低位与高位互换)。如CRC16-CCITT为0x1021,反转后为0x8408
{
unsigned short crc_16=0;
unsigned short i,j,k;
for(i=0,k=0;i<256;i++,k++)
{
      crc_16 = i<<8;
      for(j=8;j>0;j--)
      {
         if(crc_16&0x8000)                 //反转时crc_16&0x0001
             crc_16=(crc_16<<=1)^genpoly;  //反转时crc_16=(crc_16>>=1)^genpoly
         else
             crc_16<<=1;                   //反转时crc_16>>=1
      }
      crctable_16[k] = crc_16;
	  printf(" the crc16 of %d is %0x\n ",k,crc_16);
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -