您的位置:

crc语言,crc算法c语言实现

本文目录一览:

C语言中CRC循环校验的一个程序

while(len--!=0)

这句的len的值循环一次就减少1,先执行len!=0,再执行len--。

当len为0时退出循环。

for(i=0x80;

i!=0;

i/=2)

0x80是十六进制数,也即128

当i!=0时,执行循环体,

然后i=i/2,即i值减半。

用C语言实现CRC编码程序

#include stdio.h

#include string.h

#include "stdlib.h"

unsigned int char2int(char *str)

{

unsigned int count=0, ret=0;

for(count = 0; countstrlen(str);count++)

{

ret = ret1;

if('0' != str[count])

{ ret+=1;}

}

return ret;

}

unsigned int getR(char *str)

{

unsigned int c =0 ;

int ret = strlen(str)-1;

for(c=0;c strlen(str);c++)

{if(str[c] != '0')br/ {return ret-c;}

}

}

int getRi(unsigned int num)

{

int c =0;

for(;num != 0; c++)

{num = num1;}

return c;

}

void CRC(char *scode, char *p, char*g )

{

unsigned int iP = char2int(p);

unsigned int iG = char2int(g);

unsigned int r= getR(g);

unsigned int code = iP r;

unsigned int yx = code;

for(;getRi(yx) = getRi(iG);)

{ yx = yx ^ (iG(getRi(yx) - getRi(iG)));}

code += yx;

itoa(code,scode,2);

}

void main() //定义主函数

{

char data[8]="" , bds[8]="",code[16]="";

printf("数据:");

scanf("%s", data);

printf("表达式:");

scanf("%s", bds);

CRC(code,data,bds);

printf("编码:%s",code);

}

c语言 CRC的检验方式 我想问一下。这下面的C语言返回的CRC的值是什么。他有他的公式是怎么样的

CRC又称循环冗余校验,CRC返回的值其实是校验位,校验位分高位和低位。

实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。

CRC的C语言的程序

按位计算CRC采用CRC-CCITT多项式,多项式为0x11021,C语言编程时,参与计算为0x1021。当按位计算CRC时,例如计算二进制序列为1001 1010 1010 1111时,将二进制序列数左移16位,即为1001 1010 1010 1111 (0000 0000 0000 0000),实际上该二进制序列可拆分为1000 0000 0000 0000 (0000 0000 0000 0000) + 000 0000 0000 0000 (0000 0000 0000 0000) + 00 0000 0000 0000 (0000 0000 0000 0000) + 1 0000 0000 0000 (0000 0000 0000 0000) + ……

现在开始分析运算:

1对第一个二进制分序列求余数,竖式除法即为0x10000 ^ 0x11021运算,后面的0位保留;

2接着对第二个二进制分序列求余数,将第一步运算的余数*2后再和第二个二进制分序列一起对0x11021求余,这一步理解应该没什么问题。如果该分序列为0,无需计算。

3对其余的二进制序列求余与上面两步相同。

4计算到最后一位时即为整个二进制序列的余数,即为CRC校验码。

该计算方法相当于对每一位计算,运算过程很容易理解,所占内存少,缺点是一位一位计算比较耗时。

下面给出C语言实现方法:

代码如下:

unsigned char test[16] = {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff};

unsigned char len = 16;

void main( void )

{

unsigned long temp = 0;

unsigned int crc;

unsigned char i;

unsigned char *ptr = test;

while( len-- ) {

for(i = 0x80; i != 0; i = i 1) {

temp = temp * 2;

if((temp 0x10000) != 0)

temp = temp ^ 0x11021;

if((*ptr i) != 0)

temp = temp ^ (0x10000 ^ 0x11021);

}

ptr++;

}

crc = temp;

printf("0x%x ",crc);

}

搜索CRC算法的C语言代码

#include "stdio.h"

unsigned short CRC16( unsigned char *data, int length)

{

unsigned short reg_crc;

unsigned short s_crcchk;

// CString crc;

s_crcchk = 0;

reg_crc = 0x0; //应该是0,不是ffff

while(length--)

{

reg_crc ^= *data++;

for(s_crcchk = 0; s_crcchk 8; s_crcchk ++)

{

//reg_crc=reg_crc1;

if(reg_crc 0x01)

{

reg_crc = (reg_crc 1)^0xa001;//这里填多项式

}

else

{

reg_crc = reg_crc 1;

}

}

}

return reg_crc;

}

void main()

{

unsigned char a[8]={0xCD,0x67,0x41,0x85,0x00,0x00,0x00,0x01};//这里填数据

int me=CRC16(a,8);

printf("%x",me);

}

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源程序:

unsigned short crc_dsp(unsigned short reg, unsigned char data_crc)

//reg为crc寄存器, data_crc为将要处理的8bit数据流

{

unsigned short msb; //crc寄存器将移出的最高1bit

unsigned short data;

unsigned short gx = 0x8005, i = 0; //i为左移次数, gx为生成多项式

data = (unsigned short)data_crc;

data = data 8;

reg = reg ^ data;

do

{

msb = reg 0x8000;

reg = reg 1;

if(msb == 0x8000)

{

reg = reg ^ gx;

}

i++;

}

while(i 8);

return (reg);

}

以上为处理每一个8bit数据流的子程序,在计算整个数据流的CRC校验码时,我们只需将CRC_reg的初值置为0x0000,求第一个8bit的CRC值,之后,即可将上次求得的CRC值和本次将要处理的8bit数据作为函数实参传递给上述子程序的形参进行处理即可,最终返回的reg值便是我们所想得到的整个数据流的CRC校验值。