微控制器上短数据的校验和?
Checksum for short data on microcontroller?
我正在为微控制器上的短二进制数据消息(通常为 3-5 个字节)寻找一个好的校验和。我想要一些可以检测 SPI 总线上有时会发生的错误类型的东西,例如错误和重复("abc" -> "bcd",和 "abc"-> "aab")。它还应该捕捉全零、全一和全相同值的边缘情况。校验和可以增加2-4个字节。
运行 速度并不重要,因为它不会处理太多数据;但代码大小有点重要。
请参阅 http://pubs.opengroup.org/onlinepubs/009695299/utilities/cksum.html 以了解 cksum 使用的算法,它本身基于以太网标准中使用的算法。它在以太网中的用途是捕获与您遇到的错误类似的错误。
该算法将为您提供任意大小数据的 4 字节校验和。
我最终使用了 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);
}
我正在为微控制器上的短二进制数据消息(通常为 3-5 个字节)寻找一个好的校验和。我想要一些可以检测 SPI 总线上有时会发生的错误类型的东西,例如错误和重复("abc" -> "bcd",和 "abc"-> "aab")。它还应该捕捉全零、全一和全相同值的边缘情况。校验和可以增加2-4个字节。
运行 速度并不重要,因为它不会处理太多数据;但代码大小有点重要。
请参阅 http://pubs.opengroup.org/onlinepubs/009695299/utilities/cksum.html 以了解 cksum 使用的算法,它本身基于以太网标准中使用的算法。它在以太网中的用途是捕获与您遇到的错误类似的错误。
该算法将为您提供任意大小数据的 4 字节校验和。
我最终使用了 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);
}