用C语言实现CRC编码程序

用C语言实现CRC编码程序,第1张

#include <stdio.h>

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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11123264.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存