拾穗者  
只因在人群中多看了你一眼,从此你的好你的不好都留在了脑海.....

 一个CRC-8编码类,多项式为x8+x2+x+1

public class CRC8
    {

        /// <summary>
        /// 获得CRC校验码
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static byte GetCRC(byte[] data)
        {
           return GetCRC(data, data.Length);
        }

        public static byte GetCRC(byte[] data, int leng)
        {
            byte[] buf = new byte[leng + 1];

            data.CopyTo(buf, 0);

            buf[buf.Length - 1] = 0;

            byte key = 0x83; //根据多项式为x8+x2+x+1 的简码100000111去掉最低位获得

            byte crc1, crc2;

            int ptr = 0;
            int i;

            int count = leng;

            crc1 = buf[ptr++];

            while (--count >= 0)
            {
                crc2 = buf[ptr++];

                for (i = 0; i < 8; i++)
                {
                    if (((crc1 & 0x80) >> 7) == 1)//最高位为1
                    {

                        crc1 = (byte)(crc1 ^ key);//异或运算

                        crc1 = (byte)(crc1 << 1); //移出高位

                        if (((crc2 & 0x80) >> 7) == 0)//判断crc2高位是否为0
                        {
                            crc1 = (byte)(crc1 | 0x01); //crc1低位由0变1
                        }

                        crc2 = (byte)(crc2 << 1); //移出高位
                    }
                    else
                    {
                        crc1 = (byte)(crc1 << 1); //移出高位
                        if (((crc2 & 0x80) >> 7) == 1)//判断crc2高位是否为0
                        {
                            crc1 = (byte)(crc1 | 0x01); //crc1低位由0变1
                        }

                        crc2 = (byte)(crc2 << 1); //移出高位
                    }
                }

            }
            return crc1;
        }

}

posted on 2011-06-14 16:07  hcy_2011  阅读(751)  评论(0)    收藏  举报