68 lines
2.0 KiB
C#
68 lines
2.0 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|