68 lines
2.0 KiB
C#
Raw Normal View History

2026-03-30 16:25:00 +08:00
namespace BLEProtocol
{
/// <summary>
/// CRC16校验计算 (CRC16-CCITT协议)
/// 多项式: 0x1021, 初始值: 0xFFFF
/// </summary>
public static class CRC16
{
/// <summary>
/// 计算CRC16校验值 (CRC16-CCITT)
/// 使用直接计算法,不使用查找表
/// </summary>
/// <param name="data">数据字节数组</param>
/// <param name="offset">起始偏移</param>
/// <param name="length">数据长度</param>
/// <returns>CRC16校验值</returns>
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;
}
/// <summary>
/// 计算CRC16校验值 (整个数组)
/// </summary>
public static ushort Calculate(byte[] data)
{
if (data == null || data.Length == 0)
return 0;
return Calculate(data, 0, data.Length);
}
/// <summary>
/// 验证CRC16校验
/// </summary>
/// <param name="data">数据字节数组(包含CRC)</param>
/// <param name="length">数据长度(包含CRC的2字节)</param>
/// <returns>校验是否通过</returns>
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;
}
}
}