CRC8校验算法

6/30/2017 2:45:50 PM

 /********************************************************/
        /*DS18B20的CRC8校验程序*/
        /********************************************************/
        uchar calcrc_1byte(uchar abyte)
        {
            uchar i, crc_1byte;
            crc_1byte = 0;                //设定crc_1byte初值为0   
            for (i = 0; i < 8; i++)
            {
                if (((crc_1byte ^ abyte) & 0x01))
                {
                    crc_1byte ^= 0x18;
                    crc_1byte >>= 1;
                    crc_1byte |= 0x80;
                }
                else
                    crc_1byte >>= 1;
                abyte >>= 1;
            }
            return crc_1byte;
        }

        uchar calcrc_bytes(uchar* p, uchar len)
        {
            uchar crc = 0;
            while (len--) //len为总共要校验的字节数  
            {
                crc = calcrc_1byte(crc ^ *p++);
            }
            return crc;  //若最终返回的crc为0,则数据传输正确  
        }

 

public static byte CRC8(byte[] buffer)
        {
            byte crc = 0;
            for (int j = 0; j < buffer.Length; j++)
            {
                crc ^= buffer[j];
                for (int i = 0; i < 8; i++)
                {
                    if ((crc & 0x01) != 0)
                    {
                        crc >>= 1;
                        crc ^= 0x8c;
                    }
                    else
                    {
                        crc >>= 1;
                    }
                }
            }
            return crc;
        }