crc校验函数c语言 crc校验c#

求教C语言编写的CRC16的校验程序unsigned short crc_dsp(unsigned short reg, unsigned char data_crc)
//reg为crc寄存器crc校验函数c语言 ,  data_crc为将要处理crc校验函数c语言的8bit数据流
{
unsigned short msb; //crc寄存器将移出crc校验函数c语言的最高1bit
unsigned short data;
unsigned short gx = 0x8005, i = 0; //i为左移次数crc校验函数c语言 ,  gx为生成多项式
data = https://www.04ip.com/post/(unsigned short)data_crc;
data = https://www.04ip.com/post/data8;
reg = reg ^ data;
do
{
msb = reg0x8000;
reg = reg1;
if(msb == 0x8000)
{
reg = reg ^ gx;
}
i++;
}
while(i8);
return (reg);
}
谁有用C语言编写的CRC-16校验形式的代码~·高分求#definecrc16_polynomial 0x8005 //crc_16校验方式crc校验函数c语言的多项式.
typedefunsignedchar uchar;
typedefunsignedint uint;
typedefunsignedlong ulong;
typedefenumtagboolean{false,true}bool;
ulong g_ultable[256];
//crc_16方式校验crc校验函数c语言的初始化函数,计算crc_16余数表.
void_farcrc16init(void)
{
uint nremainder;
intn,m;
ulong *pultable=g_ultable;
for(n=0;n256;n++)
{
nremainder=(uint)n8;
for(m=8;m0;m--)
{
if(nremainder0x8000)
{
nremainder=(nremainder1)^crc16_polynomial;
}
else
{
nremainder=(nremainder1);
}
}
*(pultable+n)=nremainder;
}
}
//以crc_16方式计算一个数据块的crc值.
//pucdata-待校验的数据块指针.
//nbytes-数据块大小,单位是字节.
//返回值是无符号的长整型,其中低16位有效.
ulong_farcrc16calc(uchar*pucdata,intnbytes)
{
uint nremainder,nret;
intn;
uchar index;
ulong *pultable=g_ultable;
nremainder=0x0000;
for(n=0;nnbytes;n++)
{
index=(uchar)crcbitreflect(*(pucdata+n),8)^(nremainder8);
nremainder=(uint)*(pultable+index)^(nremainder8);
}
nret=(uint)crcbitreflect(nremainder,16)^0x0000;
return(nret);
}
//反转数据的比特位,反转后msb为1.
//反转前: 11101000111011100010100111100000
//反转后: 11110010100011101110001011100000
ulong_farcrcbitreflect(ulonguldata,intnbits)
{
ulong ulresult=0x00000000l;
intn;
for(n=0;nnbits;n++)
{
if(uldata0x00000001l)
{
ulresult|=(ulong)(1l((nbits-1)-n));
}
uldata=https://www.04ip.com/post/(uldata1);
}
return(ulresult);
}
crc16校验的c语言程序下面我们以CRC-16为例来说明任意长度数据流的CRC校验码生成过程 。我们采用将数据流分成若干个8bit字符 , 并由低字节到高字节传送的并行方法来求CRC校验码 。具体计算过程为:用一个16bit的寄存器来存放CRC校验值,且设定其初值为0x0000;将数据流的第一个8bit与16bit的CRC寄存器的高字节相异或,并将结果存入CRC寄存器高字节;CRC寄存器左移一位 , 最低1bit补零,同时检查移出的最高1bit,若移出的最高1bit为0,则继续按上述过程左移,若最高1bit为1,则将CRC寄存器中的值与生成多项式码相异或 , 结果存入CRC寄存器值;继续左移并重复上述处理方法,直到将8bit数据处理完为止,则此时CRC寄存器中的值就是第一个8bit数据对应的CRC校验码;然后将此时CRC寄存器的值作为初值,用同样的处理方法重复上述步骤来处理下一个8bit数据流,直到将所有的8bit字符都处理完后,此刻CRC寄存器中的值即为整个数据流对应的CRC校验码 。
下面示出了其计算过程的流程图:
在用C语言编写CRC校验码的实现程序时我们应该注意,生成多项式 对应的十六进制数为0x18005,由于CRC寄存器左移过程中,移出的最高位为1时与 相异或 , 所以与16bit的CRC寄存器对应的生成多项式的十六进制数可用0x8005表示 。下面给出并行处理8bit数据流的C源程序:

推荐阅读