首页 > 编程知识 正文

crc的c语言实现,c语言实现crc16

时间:2024-04-24 11:42:58 阅读:333441 作者:CKVY

本文目录一览:

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校验值。

用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语言零基础,怎么用C语言实现CRC16检验码

1.系统先把所有的float转换为double类型运算,最终得到的结果截取前七个作为有效数字,这样做可以使计算结果更准确。

2.有效数字:从左边第一个不是0的数字起,到精确到的位数止,所有的数字都叫做这个数的有效数字。比如:1.24的有效数字就是

1、2、4。0.24

的有效数字就是

2、4。

3.

同样的二进制数,假定你定义有符号(signed)类型,则第一位表示的是正负号,0代表正数,1代表负数;而如果定义无符号型(unsigned)的话,第一位为值了。

4.如果用指数表示,float类型有效数字为6~7位。double类型为15~16位,具体跟数字有关。

5.这个你是在哪看的啊,不对!

整形常量分为十进制、八进制、十六进制:

八进制形式为012前面有个零,十六进制为0x12前面有个0x(注意x前面是零),

而在一个八进制数字前面加表示是字符型常量,例如12为ASCII码为10的字符!

这是我逐字敲上去的,还希望您能采纳!

大侠给我个完整的crc 程序 用C语言实现的,能在PC机上运行的。我马上拿出100分。。。

楼主程序中调用函数cal_crc()的方式不正确。函数cal_crc()用于计算输入串的校验码,因此函数输入参数包含输入串及该串的长度。

建议将main()函数修改为:

#include string.h

void main()

{

unsigned char buf[] = "ABCDEFG1234567"; // 输入串

unsigned char len = 14; // 输入串的长度

unsigned int crc;

crc = cal_crc(buf, len);

}

最后需要注意的是,输入串的长度不能大于256个字节。上述例子程序中假定了输入串为字符串,实际上,还可以是字节串,此时变量len表示字节串的包含的字节个数。

C语言实现CRC校验

把我知道的说一下:

码流后面加8个0可以用移位得到(码流8;)

单次异或运算可以用运算符:^(运算符两边为常数)

由于你校验的是5个字节,且要多次异或运算,所以得借助数组,或其它的数据结果才能完成。

最后问一下你是做硬件的吗

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);

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。