本文目录一览:
- 1、C语言中CRC循环校验的一个程序
- 2、用C语言实现CRC编码程序
- 3、c语言 CRC的检验方式 我想问一下。这下面的C语言返回的CRC的值是什么。他有他的公式是怎么样的
- 4、CRC的C语言的程序
- 5、搜索CRC算法的C语言代码
- 6、crc16校验的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校验值。