本文主要是介绍分享一段crc16校验算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
分享一段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语言在线编辑器中运行,得到的结果如下。菜鸟教程真的是一个很好的网站。非常值得关注和阅读。
CSDN博客仅作为本人工作学习之余的笔记使用,无任何商业目的,如果侵犯了你的隐私或权益,请随时联系作者,本人将及时删除相关内容
这篇关于分享一段crc16校验算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!