请教一个crc16校验算法的问题:程序每句话是什么意思,做什么用的,急用!!谢谢~~

请教一个crc16校验算法的问题:程序每句话是什么意思,做什么用的,急用!!谢谢~~,第1张

以下内容可能对你有用呀。好好看看就明白了。

CRC校验

采用CRC-16,即2字节冗余循环码CRC,低字节在前。CRC码由发端计算,放置于发送消息帧的尾部,接收端再重新计算接收到信息的CRC码,比较计算得到的CRC码是否与接收到的相符,若不符则表明出错。CRC码的计算包括整个消息内容,计算时只用8位数据位,而起始位、停止位及可能的校验位均不参与CRC计算。

CRC校验可以100%检测出所有奇数个随机错误。CRC-16校验可以检测出伏陵碰斗长度小于等于16的突发错误,可以保证在1014 bit码元中只含有1位未被检测出的错误。CRC-16的具体算法有多种,以下是一个例子。

1.置16位寄存缺吵戚器为全1,作为CRC寄存器

2.把一个8位数据与16位CRC寄存器的低字节相异或,把结果放于CRC寄存器中。

3.把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位(移出位)。

4.如果最低位为0,重复③(再移位);如果最低位为1,CRC寄存器与多项式A001H(1010 0000 0000 0001)进行异或。

5.重复③、④,直到右移8次,这样整个8位数据全部进行了处理。

6.重复②-⑤,进行下一个8位数据的处理。

7.将一帧的所有数据字节处理完后得到CRC-16寄存器。

8.将CRC-16寄存器的低字节和高字节交换,得到的值即为CRC-16码。

下面我们以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校验值。

CRC校验是循伏纤环冗档缓余校缺蠢仿验,下面是C#的代码。

protected byte[] GetCRC(byte[] b, int offset, int len)

{

byte CRC16Lo = 0

byte CRC16Hi = 0

byte bytC

byte bytTreat

byte bytBcrc

for (int i = 0i <leni++)

{

bytC = b[i + offset]

for (int flag = 0flag <= 7flag++)

{

bytTreat = (byte)(bytC &0x80)

bytC = (byte)((bytC * 2) % 0x100)

bytBcrc = (byte)(CRC16Hi &0x80)

CRC16Hi = (byte)(((CRC16Hi * 2) % 0x100) + CRC16Lo / 0x80)

CRC16Lo = (byte)((CRC16Lo * 2) % 0x100)

if (bytTreat != bytBcrc)

{

CRC16Hi = (byte)(CRC16Hi ^ 0x10)

CRC16Lo = (byte)(CRC16Lo ^ 0x21)

}

}

}

byte[] ReturnData = new byte[2]

ReturnData[0] = CRC16Hi

ReturnData[1] = CRC16Lo

return ReturnData

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存