我偶然发现了这个 8 位 CRC 的实现:https://stackoverflow.com/a/15171925/243827
有人可以阐明该表是如何获得的吗?我已经取消注释 crc8_slow
函数并尝试用
byte crc;
byte data[1] = {0x01};
crc = crc8_slow(0, data, sizeof(data)/sizeof(byte));
printf("0x%.2X", crc);
对于定义为 4d、d4、a6 或 b2 的 POLY
。我似乎无法从该表中重现该值。另外,我需要如何为移位寄存器的非 0xff 初始值修改该代码?
编辑 1:
#define POLY 0xB2
byte crc;
byte data[1] = {0x80};
crc = crc8_slow(0, data, sizeof(data)/sizeof(byte));
printf("0x%.2X", crc);
byte crc8_slow(byte crc, byte *data, size_t len)
{
byte *end;
if (len == 0)
return crc;
// crc ^= 0xff;
end = data + len;
do {
crc ^= *data++;
crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1;
crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1;
crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1;
crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1;
crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1;
crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1;
crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1;
crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1;
} while (data < end);
// return crc ^ 0xff;
return crc;
}
运行时产生 0x01
。如果重要的话,我正在使用 Atmega 8 位。
最佳答案
该表是单个字节 0..255 的 crc8_slow(),没有初始和最终异或。该代码已经将 POLY
定义为 0xb2
,它是给定多项式的反射(reflect)(0x4d
位反转)。
对于具有零初始寄存器值且没有最终异或的不同 CRC-8 定义,只需从代码中删除两个异或。
可以看看crcany为任何给定的规范生成 CRC 代码。
关于CRC8算法说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41922021/