示例#1
0
 public static ICRC Create(CRCMode mode)
 {
     ICRC crc = null;
     switch (mode)
     {
         case CRCMode.CRC8:
             crc = new CRC8();
             break;
     }
     return crc;
 }
示例#2
0
        /// <summary>
        /// 16位CRC检验码生成器
        /// </summary>
        /// <param name="data">数据</param>
        /// <param name="mode">CRC模式</param>
        /// <returns>CRC检验码,高位在前</returns>
        public static byte[] CRC16(byte[] data, CRCMode mode)
        {
            ushort crcpoly, crcinit = 0x0000, crcxorout = 0x0000;
            bool   refin = true, refout = true;

            switch (mode)
            {
            case CRCMode.CCITT:
                crcpoly = 0x1021;
                break;

            case CRCMode.CCITT_FALSE:
                crcpoly = 0x1021;
                crcinit = 0xFFFF;
                refin   = false;
                refout  = false;
                break;

            case CRCMode.DNP:
                crcpoly   = 0x3D65;
                crcxorout = 0xFFFF;
                break;

            case CRCMode.IBM:
                crcpoly = 0x8005;
                break;

            case CRCMode.MAXIM:
                crcpoly   = 0x8005;
                crcxorout = 0xFFFF;
                break;

            case CRCMode.MODBUS:
                crcpoly = 0x8005;
                crcinit = 0xFFFF;
                break;

            case CRCMode.USB:
                crcpoly   = 0x8005;
                crcinit   = 0xFFFF;
                crcxorout = 0xFFFF;
                break;

            case CRCMode.X25:
                crcpoly   = 0x1021;
                crcinit   = 0xFFFF;
                crcxorout = 0xFFFF;
                break;

            case CRCMode.XMODEM:
                crcpoly = 0x1021;
                refin   = false;
                refout  = false;
                break;

            default:
                crcpoly = 0x8005;
                crcinit = 0xFFFF;
                break;
            }

            foreach (byte t in data)
            {
                byte temp = t;
                if (refin)
                {
                    char[] arr = Convert.ToString(temp, 2).PadLeft(8, '0').ToCharArray();
                    Array.Reverse(arr);
                    temp = Convert.ToByte(new string(arr), 2);
                }

                crcinit ^= (ushort)(temp << 8);
                for (var j = 0; j < 8; j++)
                {
                    crcinit = (ushort)((crcinit & 0x8000) > 0 ? (crcinit << 1) ^ crcpoly : crcinit << 1);
                }
            }

            if (refout)
            {
                char[] arr = Convert.ToString(crcinit, 2).PadLeft(16, '0').ToCharArray();
                Array.Reverse(arr);
                crcinit = Convert.ToUInt16(new string(arr), 2);
            }

            crcinit ^= crcxorout;
            var hi = (byte)((crcinit & 0xFF00) >> 8);
            var lo = (byte)(crcinit & 0x00FF);

            return(new[] { hi, lo });
        }
示例#3
0
 public void SetCRCMode(CRCMode mode)
 {
     lock (this)
     {
         SendCommand(new byte[] { (byte)RNCommands.SetCRCMode, (byte)mode });
     }
 }