CRC 实现,生成校验码和验证

来源:互联网 发布:新网已备案域名 编辑:程序博客网 时间:2024/05/16 11:42
    class CrcClass    {        static ushort[] crc_table =              {                  0x0000 ,  0x1021 ,  0x2042 ,  0x3063 ,  0x4084 ,  0x50a5 ,  0x60c6 ,  0x70e7 ,                  0x8108 ,  0x9129 ,  0xa14a ,  0xb16b ,  0xc18c ,  0xd1ad ,  0xe1ce ,  0xf1ef ,                  0x1231 ,  0x0210 ,  0x3273 ,  0x2252 ,  0x52b5 ,  0x4294 ,  0x72f7 ,  0x62d6 ,                  0x9339 ,  0x8318 ,  0xb37b ,  0xa35a ,  0xd3bd ,  0xc39c ,  0xf3ff ,  0xe3de ,                  0x2462 ,  0x3443 ,  0x0420 ,  0x1401 ,  0x64e6 ,  0x74c7 ,  0x44a4 ,  0x5485 ,                  0xa56a ,  0xb54b ,  0x8528 ,  0x9509 ,  0xe5ee ,  0xf5cf ,  0xc5ac ,  0xd58d ,                  0x3653 ,  0x2672 ,  0x1611 ,  0x0630 ,  0x76d7 ,  0x66f6 ,  0x5695 ,  0x46b4 ,                  0xb75b ,  0xa77a ,  0x9719 ,  0x8738 ,  0xf7df ,  0xe7fe ,  0xd79d ,  0xc7bc ,                  0x48c4 ,  0x58e5 ,  0x6886 ,  0x78a7 ,  0x0840 ,  0x1861 ,  0x2802 ,  0x3823 ,                  0xc9cc ,  0xd9ed ,  0xe98e ,  0xf9af ,  0x8948 ,  0x9969 ,  0xa90a ,  0xb92b ,                  0x5af5 ,  0x4ad4 ,  0x7ab7 ,  0x6a96 ,  0x1a71 ,  0x0a50 ,  0x3a33 ,  0x2a12 ,                  0xdbfd ,  0xcbdc ,  0xfbbf ,  0xeb9e ,  0x9b79 ,  0x8b58 ,  0xbb3b ,  0xab1a ,                  0x6ca6 ,  0x7c87 ,  0x4ce4 ,  0x5cc5 ,  0x2c22 ,  0x3c03 ,  0x0c60 ,  0x1c41 ,                  0xedae ,  0xfd8f ,  0xcdec ,  0xddcd ,  0xad2a ,  0xbd0b ,  0x8d68 ,  0x9d49 ,                  0x7e97 ,  0x6eb6 ,  0x5ed5 ,  0x4ef4 ,  0x3e13 ,  0x2e32 ,  0x1e51 ,  0x0e70 ,                  0xff9f ,  0xefbe ,  0xdfdd ,  0xcffc ,  0xbf1b ,  0xaf3a ,  0x9f59 ,  0x8f78 ,                  0x9188 ,  0x81a9 ,  0xb1ca ,  0xa1eb ,  0xd10c ,  0xc12d ,  0xf14e ,  0xe16f ,                  0x1080 ,  0x00a1 ,  0x30c2 ,  0x20e3 ,  0x5004 ,  0x4025 ,  0x7046 ,  0x6067 ,                  0x83b9 ,  0x9398 ,  0xa3fb ,  0xb3da ,  0xc33d ,  0xd31c ,  0xe37f ,  0xf35e ,                  0x02b1 ,  0x1290 ,  0x22f3 ,  0x32d2 ,  0x4235 ,  0x5214 ,  0x6277 ,  0x7256 ,                  0xb5ea ,  0xa5cb ,  0x95a8 ,  0x8589 ,  0xf56e ,  0xe54f ,  0xd52c ,  0xc50d ,                  0x34e2 ,  0x24c3 ,  0x14a0 ,  0x0481 ,  0x7466 ,  0x6447 ,  0x5424 ,  0x4405 ,                  0xa7db ,  0xb7fa ,  0x8799 ,  0x97b8 ,  0xe75f ,  0xf77e ,  0xc71d ,  0xd73c ,                  0x26d3 ,  0x36f2 ,  0x0691 ,  0x16b0 ,  0x6657 ,  0x7676 ,  0x4615 ,  0x5634 ,                  0xd94c ,  0xc96d ,  0xf90e ,  0xe92f ,  0x99c8 ,  0x89e9 ,  0xb98a ,  0xa9ab ,                  0x5844 ,  0x4865 ,  0x7806 ,  0x6827 ,  0x18c0 ,  0x08e1 ,  0x3882 ,  0x28a3 ,                  0xcb7d ,  0xdb5c ,  0xeb3f ,  0xfb1e ,  0x8bf9 ,  0x9bd8 ,  0xabbb ,  0xbb9a ,                  0x4a75 ,  0x5a54 ,  0x6a37 ,  0x7a16 ,  0x0af1 ,  0x1ad0 ,  0x2ab3 ,  0x3a92 ,                  0xfd2e ,  0xed0f ,  0xdd6c ,  0xcd4d ,  0xbdaa ,  0xad8b ,  0x9de8 ,  0x8dc9 ,                  0x7c26 ,  0x6c07 ,  0x5c64 ,  0x4c45 ,  0x3ca2 ,  0x2c83 ,  0x1ce0 ,  0x0cc1 ,                  0xef1f ,  0xff3e ,  0xcf5d ,  0xdf7c ,  0xaf9b ,  0xbfba ,  0x8fd9 ,  0x9ff8 ,                  0x6e17 ,  0x7e36 ,  0x4e55 ,  0x5e74 ,  0x2e93 ,  0x3eb2 ,  0x0ed1 ,  0x1ef0           };        //生成CRC效验码        public static ushort getCRC_CCITT(byte[] data, int len)        {            byte hbit = 0;            ushort crc = 0x0000;            for (int i = 0; i < len; i++)            {                hbit = (byte)((crc & 0xff00) >> 8);                crc <<= 8;                crc ^= crc_table[hbit ^ data[i]];            }            return crc;        }    }



        //增加内部CRC效验码        public static string EncodeFirstCrcCode(string innerCode)        {            string firstCrcCode;            byte[] byteDataSource = CommonClass.strToHexByte(innerCode);            firstCrcCode = innerCode + CrcClass.getCRC_CCITT(byteDataSource, byteDataSource.Length).ToString("X");            return firstCrcCode;        }

验证CRC

        public bool CheckDecodeCrc(string secondCrcCode)        {            byte[] byteDataSource = CommonClass.strToHexByte(secondCrcCode);            secondCrcCode =  CrcClass.getCRC_CCITT(byteDataSource, byteDataSource.Length).ToString("X");            bool result;            if(secondCrcCode.Equals("0"))            {                result = true;            }            else            {                result = false;            }            return result;        }

注:CRC有好几种格式,我这里只是根据项目情况编写的其中一种。

详见我的BLOG里面有关CRC的介绍。


原创粉丝点击