#include <string.h>
void main()
{
char *str
char *res
scanf("%s",str)
int length =strlen(str)
res=calc_crc8(str,(char)length)
}
CRC代数学的一般性算法
在代数编码理论中,将一个码组表示为一个多项式,码组中各码元当作多项式的系数。例如
1100101
表示为
1·x6+1·x5+0·x4+0·x3+1·x2+0·x+1,即
x6+x5+x2+1。
设编码前的原始信息多项式为P(x),P(x)的最高幂次加1等于k;生成多项式为G(x),G(x)的最高幂次等于r;CRC多项式为R(x);编码后的带CRC的信息多项式为T(x)。
发送方编码方法:将P(x)乘以xr(即对应的二进制码序列左移r位),再除以G(x),所得余式即为R(x)。用公式表示为
T(x)=xrP(x)+R(x)
接收方解码方法:将T(x)除以G(x),如果余数为0,则说明传输中无错误发生,槐者否则说明传输有误。
举例来说,设信息码为1100,生成多项式为1011,即P(x)=x3+x2,G(x)=x3+x+1,计算CRC的过程为
xrP(x)
x3(x3+x2)
x6+x5
x
---------
=
------------
=
---------
=
(x3+x2+x)
+
---------
G(x)
x3+x+1
x3+x+1
x3+x+1
即
R(x)=x。注意到G(x)最高幂次r=3,得出CRC为010。
附:CRC算法的C程序
1)
求CRC码岩键的运算采用模2运算,
所谓模2运算就是不带进位和借位,
因此加法和减法等价,实际上就是逻辑上的异或运粗明巧算,
除法可以用多次模2减法实现.
2)
所谓CRC码,
就是把数据块左移16位,
然后除以0x11021所得到的余数(由CCITT推荐).
3)
据此写出以下的CRC的C程序.
*ptr指向发送数据块的首地址,
len是数据块以字节为单位的长度.
uint
cal_crc(uchar
*ptr,
uchar
len)
{
uint
crc
uchar
i
crc=0
while(len--!=0)
{
for(i=0x80
i!=0
i/=2)
{
if((crc&0x8000)!=0)
{crc*=2
crc^=0x1021}
else
crc*=2
if((*ptr&i)!=0)
crc^=0x1021
}
ptr++
}
return(crc)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)