#include <string.h>
#include "stdlib.h"
unsigned int char2int(char *str)
{
unsigned int count=0, ret=0
for(count = 0count<strlen(str)count++)
{
ret = ret<<1
if('0' != str[count])
{ ret+=1}
}
return ret
}
unsigned int getR(char *str)
{
unsigned int c =0
int ret = strlen(str)-1
for(c=0c <strlen(str)c++)
{if(str[c] != '0')<br/> {return ret-c}
}
}
int getRi(unsigned int num)
{
int c =0
for(num != 0c++)
{num = num>>1}
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 校验码的实现程序时我们应该注意,生成多项式 对应的十六进制数为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 校验值。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)