【发布时间】:2017-06-14 18:58:35
【问题描述】:
我偶然发现了这种 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);
对于 POLY 定义为 4d、d4、a6 或 b2。我似乎无法从该表中重现该值。另外,我如何需要为移位寄存器的非 0xff 初始值修改该代码?
EDIT1:
#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 位上。
【问题讨论】:
-
“EDIT1”代码不能直接运行,但是当它可以运行时,它会给出
0xB2。我必须添加一个typedef unsigned char byte;。 -
@MarkAdler 不,将所有内容切换到
unsigned char- 结果相同 -
您需要发布您运行的准确完整的代码。
标签: c xor crc binary-operators