zoukankan      html  css  js  c++  java
  • C# CRC8校验

    1. 查表法:
    public class CRC8
    {
        /// <summary> 
        
    /// CRC8位校验表 
        
    /// </summary> 
        private byte[] CRC8Table = new byte[] { 
            0,94,188,226,97,63,221,131,194,156,126,32,163,253,31,65
            157,195,33,127,252,162,64,3095,1,227,189,62,96,130,220,
            35,125,159,193,66,28,254,160,225,191,93,3,128,222,60,98,
            190,224,2,92,223,129,99,61,124,34,192,158,29,67,161,255,
            70,24,250,164,39,121,155,197,132,218,56,102,229,187,89,7,
            219,133,103,57,186,228,6,88,25,71,165,251,120,38,196,154,
            101,59,217,135,4,90,184,230,167,249,27,69,198,152,122,36,
            248,166,68,26,153,199,37,123,58,100,134,216,91,5,231,185,
            140,210,48,110,237,179,81,15,78,16,242,172,47,113,147,205,
            17,79,173,243,112,46,204,146,211,141,111,49,178,236,14,80,
            175,241,19,77,206,144,114,44,109,51,209,143,12,82,176,238,
            50,108,142,208,83,13,239,177,240,174,76,18,145,207,45,115,
            202,148,118,40,171,245,23,73,8,86,180,234,105,55,213,139,
            87,9,235,181,54,104,138,212,149,20341,119,244,170,72,22,
            233,183,85,11,136,214,52,106,43,117,151,201,74,20,246,168,
            116,42,200,150,21,75,169,247,182,232,10,84,215,137,107,53 };

        public byte CRC(byte[] buffer)
        {
            return CRC(buffer, 0, buffer.Length);
        }

        public byte CRC(byte[] buffer, int off, int len)
        {
            byte crc = 0;
            if (buffer == null)
            {
                throw new ArgumentNullException("buffer");
            }
            if (off < 0 || len < 0 || off + len > buffer.Length)
            {
                throw new ArgumentOutOfRangeException();
            }

            for (int i = off; i < len; i++)
            {
                crc = CRC8Table[crc ^ buffer[i]];
            }
            return crc;
        }
    }

    2. 计算法1:

    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;
    }

    3. 计算法2:

    public byte CRC8(byte[] buffer)    
    {   
        byte crc=0;
        for (int j=0;j<buffer.Length;j++)
        {
            for (int i = 1; i != 0; i *= 2)
            {
                if ((crc & 1) != 0)
                {
                    crc /= 2;
                    crc ^= 0x8C;
                }
                else
                {
                    crc /= 2;
                }
                if ((buffer[j] & i) != 0) crc ^= 0x8C;  
            }      
        }
        return crc;
    }
    注:查表法和计算法1的CRC的结果相同。
  • 相关阅读:
    学习:类和对象——继承
    学习:类和对象——运算符重载
    域权限维持:Skeleton Key
    域权限维持:SSP密码记录
    学习:类和对象——友元
    学习:类和对象——对象模型和this指针
    学习:类和对象——静态成员变量和函数
    学习:类和对象——初始化列表和内部类
    学习:类和对象——深拷贝和浅拷贝
    二维数组中的查找
  • 原文地址:https://www.cnblogs.com/anjou/p/2217783.html
Copyright © 2011-2022 走看看