namespace BLEProtocol { /// /// CRC16校验计算 (CRC16-CCITT协议) /// 多项式: 0x1021, 初始值: 0xFFFF /// public static class CRC16 { /// /// 计算CRC16校验值 (CRC16-CCITT) /// 使用直接计算法,不使用查找表 /// /// 数据字节数组 /// 起始偏移 /// 数据长度 /// CRC16校验值 public static ushort Calculate(byte[] data, int offset, int length) { ushort crc = 0xFFFF; for (int i = 0; i < length; i++) { crc ^= (ushort)(data[offset + i] << 8); for (int j = 0; j < 8; j++) { if ((crc & 0x8000) != 0) { crc = (ushort)((crc << 1) ^ 0x1021); } else { crc <<= 1; } } } return crc; } /// /// 计算CRC16校验值 (整个数组) /// public static ushort Calculate(byte[] data) { if (data == null || data.Length == 0) return 0; return Calculate(data, 0, data.Length); } /// /// 验证CRC16校验 /// /// 数据字节数组(包含CRC) /// 数据长度(包含CRC的2字节) /// 校验是否通过 public static bool Validate(byte[] data, int length) { if (data == null || length < 3) return false; ushort calculatedCrc = Calculate(data, 0, length - 2); ushort receivedCrc = (ushort)(data[length - 2] | (data[length - 1] << 8)); return calculatedCrc == receivedCrc; } } }