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;
}
}
}