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
}
由于多项式的最高为都为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:简单的过客)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)