public static ICRC Create(CRCMode mode) { ICRC crc = null; switch (mode) { case CRCMode.CRC8: crc = new CRC8(); break; } return crc; }
/// <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 }); }
public void SetCRCMode(CRCMode mode) { lock (this) { SendCommand(new byte[] { (byte)RNCommands.SetCRCMode, (byte)mode }); } }