我在微控制器上寻找短二进制数据消息(典型值为3-5字节)的良好校验和。我想要一些能够检测到SPI总线上有时会发生的错误的东西,例如逐个和重复(" abc" - >" bcd"和" ABC" - >" AAB&#34)。此外,它应该捕获全零,全1和全相同值的边缘情况。校验和可以增加2-4个字节。
运行速度并不重要,因为这不会处理太多数据;但代码大小有点重要。
答案 0 :(得分:2)
我最终使用CRC16 CCITT。这只是目标系统上大约50个字节的编译代码(不使用任何查找表!),运行速度相当快,并且非常适合处理全零和全部情况。
代码(来自http://www.sal.wisc.edu/st5000/documents/tables/crc16.c):
unsigned short int
crc16(unsigned char *p, int n)
{
unsigned short int crc = 0xffff;
while (n-- > 0) {
crc = (unsigned char)(crc >> 8) | (crc << 8);
crc ^= *p++;
crc ^= (unsigned char)(crc & 0xff) >> 4;
crc ^= (crc << 8) << 4;
crc ^= ((crc & 0xff) << 4) << 1;
}
return(crc);
}
答案 1 :(得分:1)
请参阅http://example.com/promo/1了解cksum使用的算法,该算法本身基于以太网标准中使用的算法。它在以太网中的使用是为了捕捉与你所面临的错误类似的错误。
该算法将为您提供任意大小的数据的4字节校验和。