我正在寻找一个好的校验和短二进制数据消息(典型的3-5字节)在一个微控制器。我想要一些能检测到有时会在SPI总线上发生的错误类型的东西,例如个别错误和重复错误("abc“-> "bcd”和"abc"->"aab")。此外,它还应该捕捉所有-零,所有-1和所有相同值的边缘情况。校验和可以添加2-4字节.
运行速度并不像处理大量数据那么重要;但是代码大小在某种程度上是很重要的。
发布于 2015-06-11 00:34:23
最后我使用了CRC16 CCITT。这是目标系统上编译的代码的大约50字节(不使用任何查找表!),运行速度相当快,并且非常恰当地处理所有-零和全部-1的情况。
代码(来自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);
}发布于 2015-05-15 02:27:28
关于cksum使用的算法,请参见http://pubs.opengroup.org/onlinepubs/009695299/utilities/cksum.html,该算法本身基于以太网标准中使用的算法。它在以太网中的用途是捕捉与您所面临的错误相似的错误。
该算法将为任意大小的数据提供一个4字节的校验和。
https://stackoverflow.com/questions/30249273
复制相似问题