算法
- CRC16 校驗寄存器賦值為 0xFFFF;
- 取被校驗串的第一個字節賦值給臨時寄存器;
- 臨時寄存器與 CRC16 校驗寄存器的高位字節進行“異或”運算,賦值給 CRC16 校驗寄存器;
- 取 CRC16 校驗寄存器最后一位賦值給檢測寄存器;
- 把 CRC16 校驗寄存器右移一位;
- 若檢測寄存器值為 1,CRC16 校驗寄存器與多項式 0xA001 進行“異或”運算,賦值給 CRC16 校驗寄存器;
- 重復步驟 4~6,直至移出 8 位;
- 取被校驗串的下一個字節賦值給臨時寄存器;
- 重復步驟 3~8,直至被校驗串的所有字節均被校驗;
- 返回 CRC16 校驗寄存器的值。
校驗碼按照先高字節后低字節的順序存放。
代碼
public static string GetHj212Crc16(byte[] bytes)
{
int crcRegister = 0xFFFF;
for (int i = 0; i < bytes.Length; i++)
{
crcRegister = (crcRegister >> 8) ^ bytes[i];
for (int j = 0; j < 8; j++)
{
int check = crcRegister & 0x0001;
crcRegister >>= 1;
if (check == 0x0001)
{
crcRegister ^= 0xA001;
}
}
}
string result = string.Format("{0:X}", crcRegister);//轉十六進制
for (int i = result.Length; i < 4; i++)//補足 4 位
{
result = "0" + result;
}
return result;
}
代碼地址:Hj212Crc16