C# CRC8的实现(原创)

it2022-05-09  20

  最近由于要做一个串口控制类的上位机程序,需要用CRC校验发送和接收的数据,于是上网搜相关内容,发现此类文章并不多,都是互相抄袭,没有自己的想法,我于是就自己仔细思考和实验了一下,发现并不难实现。

CRC的原理:不准确的说就是用数据包除以CRC多项式。

数据包不用说了,CRC多项式是什么呢?CRC多项式就是一个8bit的数,要求最高位是1,因此CRC16的CRC多项式就是16bit,CRC32的CRC多项式就是32bit。

那么怎么除呢?就是把数据包和CRC多项式按位异或,一直异或到最后一位,最后结果就是CRC的值。

废话不多讲,举一个例子看看:

CRC多项式取0x85,即1000 0101

数据包取byte型的数组,这里取三字节。{0x11,0x22,0x33}

运算步骤如下:

最后的结果就是0100 0001即0x41。

知道这个原理,代码就好写了,下面再贴上C#的源码:

1: /// <summary> 2: /// CRC8CCITT式校验 3: /// </summary> 4: /// <param name="crcPoly">校验多项式 byte</param> 5: /// <param name="data">数据</param> 6: /// <returns>返回原数组+CRC校验字节</returns> 7: public int CRC8CCITT(byte crcPoly, byte[] data) 8: { 9: byte CRCPoly = 0x85;//CRC多项式,当做除数 10: byte[] Data = data; 11: byte CRCTempResult = 0x00;//CRC结果运算的得数,但不是最后的值 12: byte CRCResult = 0x00;//CRC结果运算最后的值 13: 14: CRCTempResult = (byte)(Data[0] ^ CRCPoly); 15: 16: for (int arrayLength = 1; arrayLength <= (data.Length-1); arrayLength++) 17: { 18: for (int i = 0; i < 8; i++) 19: { 20: if ((CRCTempResult & 0x80) == 0x00) 21: { 22: CRCTempResult = (byte)(CRCTempResult << 1); 23: CRCTempResult = (byte)( 24: CRCTempResult | 25: ((Data[arrayLength] & 0x80) == 0x80 ? 0x01 : 0x00) 26: ); 27: Data[arrayLength] <<= 1; 28: } 29: else 30: { 31: CRCTempResult = (byte)(CRCTempResult ^ CRCPoly); 32: i--; 33: } 34: } 35: } 36: CRCResult = CRCTempResult; 37: return CRCResult; 38: }

转载于:https://www.cnblogs.com/humaoxiao/archive/2012/02/28/2371514.html

相关资源:CRC检校算法实现

最新回复(0)