易语言CRC16效验程序

易语言CRC16效验程序,第1张

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

}

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

由于多项式的最高为都为1,并且在代码的crc8计算中,最高位也是不使用的,

所以在多项式记录时都去掉了最高位。

CRC校验算法,说白了,就是把需要校验的数据与多项式进行循环袜森异或弊世(XOR),

但进行XOR的方式与实际中数据传输时,是高位先传、还是低位先传有关。对于数据

高位先传的方式,XOR从数据的高位开始,我们就叫它顺序异或吧;对于数据低位先

传的方式,XOR从数据的低位开始,我们就叫它反序异或吧。两种不同的异或方式,

即使对应相同的多项式,计算出来的结果也是不一样的。

下面以顺序异或的例子说明一些计算的过程:

使用多项式:x8+x5+x4+1(二进制为:100110001)

计算一个字节:0x11(二进租好肢制为:00010001)

计算步骤:

A、 因为采用顺序异或,所以需要计算的数据左移8位,

移位后数据为:0001 0001 0000 000

B、 先进行高9bit异或(多项式为9bit),0001 0001 0000 0000,因为高9bit的

最高bit为0,不需要进行异或,同理,接下来的两bit也是0,也不需要进行进行异或。

这样处理后数据为:1 0001 0000 0000;

C、 接下来最高位为1,需要进行异或 *** 作了

(搬运by:简单的过客)


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存