【发布时间】:2018-09-15 07:01:32
【问题描述】:
我需要为一系列字节计算 CRC7
我的多项式 x^7+x^3+1
这是我写的一个函数:
unsigned char CRC7(const unsigned char message[], const unsigned int length)
{
const unsigned char poly = 0b10001001;
unsigned char crc = 0;
for (int i = 0; i < length; i++ )
{
crc ^= message[i];
for (int j = 0; j < 8; j++)
crc = crc & 0x1 ? (crc >> 1) ^ poly : crc >> 1;
}
return crc;
}
但它给出了错误的结果。例如 0x82 和 0x04 返回 0x57,而它必须是 0x61
这个在线计算器适合我:http://www.ghsi.de/pages/subpages/Online%20CRC%20Calculation/
我不能只是从中复制粘贴一个函数,因为我需要它将值作为无符号字符返回。
我会在哪里犯错?
【问题讨论】:
-
我认为这些移位应该是左移位 (
<<),并且您应该检查是否设置了 msb (crc & 0x80)。 -
试试这个网站(我没有检查是否正确):github.com/hazelnusse/crc7/blob/master/crc7.cc
-
如果该功能适合您,那么您可以使用它。从
// Convert binary to ASCII开始,您应该能够生成您想要的输出。 -
与你的问题无关,如果你能负担得起 128 字节的额外 ROM 使用,生成一个 128 位大查找表可能是正确的解决方案。
-
CRC 规范需要的不仅仅是多项式。您需要位顺序、初始化和最终异或值(有时最终异或值为零,这就像没有那一步)。