分享一段CRC16的算法
#include <stdio.h>
//CRC初始值 0x1D0F, Poly: 0x1021.
CRC校验算法核心代码:
- 输入待校验的字符串,返回CRC16的数值,
- 输入待校验的字符串+CRC16数值,如果返回值为0,则表示校验码是正确的。
#define POLY 0x1021 //crc-ccitt mask
unsigned short SW_CheckCrc16(unsigned short crc, unsigned char *pDataAddr, unsigned short bDataLen)
{
unsigned char WorkData;
unsigned char bitMask;
unsigned char NewBit;
while(bDataLen--)
{
WorkData = *pDataAddr++;
for (bitMask = 0x80; bitMask != 0; bitMask >>= 1)
{
//Align test bit with next bit of the message unsigned char, starting with msb.
NewBit = ((WorkData & bitMask) != 0) ^ ((crc & 0x8000) != 0);
crc <<= 1;
if (NewBit)
{
crc ^= POLY;
}
}
//for (bitMask = 0x80; bitMask != 0; bitMask >>= 1)
}
return crc;
}
一个数据包通常由前导码,包头,载荷,校验四部分组成。包头,载荷是需要校验的数据。
Preamble | Frame header | payload | integrity checks |
---|
数据包校验程序:以包头的校验结果来校验载荷。
unsigned short SW_CreateCrc16( unsigned char *pHeaderAddr, unsigned char bHeaderLen, unsigned char *pPayloadAddr, unsigned char bPayloadLen)
{
unsigned short crc;
crc = 0x1D0F;
crc = SW_CheckCrc16(crc, pHeaderAddr, bHeaderLen);
//printf("HeaderAddr %d \n",crc);//crc = 0x1D0F;
crc = SW_CheckCrc16(crc, pPayloadAddr, bPayloadLen);
//printf("PayloadAddr %x \n",crc);
return crc;
}
写一个主程序来测试上面的CRC16算法:
int main()
{
unsigned char headArray[12] = {0,0,0,0,0,0,0,0,0,0,0x84,0xF9};
unsigned char payloadArray[10] = {0};
SW_CreateCrc16(headArray,12,payloadArray,10);
return 0;
}
将程序放在"菜鸟教程"C语言在线编辑器中运行,得到的结果如下。菜鸟教程真的是一个很好的网站。非常值得关注和阅读。
优快云博客仅作为本人工作学习之余的笔记使用,无任何商业目的,如果侵犯了你的隐私或权益,请随时联系作者,本人将及时删除相关内容