C#_CRC-16/CCITT-FALSE计算加判断
前言:浪费半天时间研究出来的,试了网上其他好几个版本都算了不对,讲述的也不明确,我是直接移植一个c语言的版本,直接看代码,一个函数包含计算和判断的工能

private bool CRC16(byte[] buffer, ref byte[] ResCRC16) //C# crc-16/CCITT-FALSE,带判断校验的
{bool status = false;ushort crc = 0xFFFF;int size = buffer.Length; //计算待计算的数据长度int i = 0;if (size > 0){while(size-- > 0){crc = (ushort)((crc >> 8)|(crc << 8));crc ^= buffer[i++];crc ^= (ushort)(((byte)crc) >> 4);crc ^= (ushort)(crc << 12);crc ^= (ushort)((crc & 0xff) << 5);}}//判断输入的ResCRC16与计算出来的是否一致if(ResCRC16[0] == (byte)((crc >> 8) & 0xff) && ResCRC16[1] == (byte)(crc & 0xff)){status = true;}ResCRC16[1] = (byte)(crc & 0xff);ResCRC16[0] = (byte)((crc >> 8) & 0xff);return status;
}
接下来演示使用过程
private void button1_Click(object sender, EventArgs e)
{byte[] data = new byte[] { 0x01 ,0x22, 0x01, 0x08, 0x00, 0xe8, 0xa3, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00 };byte[] data2 = new byte[2];byte[] data3 = new byte[] { 0x94,0x5c};CRC16(data,ref data2);Console.WriteLine(data2[0]); //打印CRC算出来的值Console.WriteLine(data2[1]); //打印CRC算出来的值Console.WriteLine(CRC16(data, ref data3)); //判断是否是预设的CRC
}















