网站上的算法大都是查512字节表的,对单片机来讲,太浪费空间了。
根据网上资料,修改并测试通过以下算法:
static const unsigned short crc16tab[] = {
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
};
/**
* CRC-16/XMODEM (C语言)
*/
unsigned short crc16_xmodem(unsigned char *ptr, unsigned int len)
{
unsigned short crc = 0;
unsigned char ch = 0;
while (len-- != 0)
{
ch = crc >> 12;
crc <<= 4;
crc ^= crc16tab[ch ^ (*ptr / 16)];
ch = crc >> 12;
crc <<= 4;
crc ^= crc16tab[ch ^ (*ptr & 0x0f)];
ptr++;
}
return crc;
}
以下是Go语言版:
var crc16tab = []uint16{
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
}
/**
* CRC-16/XMODEM (Go语言)
*/
func crc16_xmodem(buf []byte) uint16 {
var crc uint16 = 0
var ch byte = 0
size

本文提供了一种针对单片机优化的CRC-16/XMODEM校验算法实现,分别用C语言和Go语言给出具体代码。该算法通过查表方式减少内存占用,适用于资源受限的嵌入式系统。
610

被折叠的 条评论
为什么被折叠?



