C语言CRC校验码生成算法详解
#include<stdio.h> int main() { unsigned int g,k,r,l,n,b,c,d,e,p,i,s,j,cont; //定义变量,其中g为生成多项式的值,k为信息多项式的值,s为CRC 的值,r、l、n、b、c、d、e、p、i、j、cont为中间变量 register int s1; //寄存器变量 printf('以下数据一十六进制计数方式输入\n'); //提示用户输入数据 printf('请输入生成码的值:\n'); scanf('%d',&g); //获取生成多项式的值 printf('请输入信息码的值:\n'); scanf('%d',&k); //获取信息多项式的值 { unsigned int m,w=0; //定义中间变量m和w m=g; do {m>>=1;w++;} //计算m的二进制位数 while (m!=0); r=w; //生成多项式的位数为r } { unsigned int m,w=0; //定义中间变量m和w m=k; do {m>>=1;w++;} //计算m的二进制位数 while (m!=0); n=w; //信息多项式的位数为n } k<<=r-1; //将信息多项式左移r-1位 l=n+r-1; //CRC 的位数为n+r-1 cont=r; //设置中间变量cont的初值为r i=k; //将信息多项式赋值给i i>>=(n-1); //将i右移n-1位 do { s=i^g; //计算i异或生成多项式的值 p=r;c=0; //设置中间变量p和c的初值为r和0 for(j=0;j<r;j++) //循环r次 { s1=s; s1>>=(p-1); //将s1右移p-1位 if((s1&01)==0) //如果s1的最后一位为0 {p--;c++;} //将p减1,c加1 else break; } if (c>l-cont) //如果c大于l-cont break; //跳出循环 s<<=c; //将s左移c位 i=k; //将信息多项式赋值给i b=i>>(n-1-c); //将i右移n-1-c位 d=~(~0<<c); //将d设置为2的c次方减1 e=b&d; //将b与d进行按位与操作 s=s|e; //将s和e进行按位或操作 i=s; //将s赋值给i cont+=c; //将c加到cont上 } while (cont==l); //当cont等于l时继续循环 s=s|k; //将最后余数和信息码合在一起,形成CRC 的值 printf('运行结果为:\n'); //输出运行结果 printf('生成多项式的值g=%x\n',g); //输出生成多项式的值 printf('信息多项式的值k=%x\n',k); //输出信息多项式的值 printf('CRC 的值s=%x\n',s); //输出CRC 的值 }
原文地址: https://www.cveoy.top/t/topic/ndqB 著作权归作者所有。请勿转载和采集!