我偶然发现了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的POLY,d4、a6或b2。我似乎无法重现那张桌子上的价值。另外,如何修改移位寄存器的非0 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。我是在阿特米加8位,如果这是重要的。
发布于 2017-01-29 16:54:43
Poly被0x14D反转,然后右移1位得到0xB2。crc是bit reflected,它使用右移位而不是左移位。
101001101 0x14d
101100101 0x14d bit reversed = 0x165
10110010 0x14d bit reversed >> 1 = 0xB2如果您查看crc8_table[0x80],您将看到一个0xB2。每行有12字节长,由于索引0x80是十进制128,请查看以0x1d开头的第10行,然后查看字节8(该行的第一个字节为120),以查看0xB2。
我测试了这段代码,它输出了一个0xB2:
#include <stdio.h>
typedef unsigned char byte;
#define POLY 0xB2
// prototype
byte crc8_slow(byte crc, byte *data, size_t len);
int main(){
byte crc;
byte data[1] = {0x80};
crc = crc8_slow(0, data, sizeof(data)/sizeof(byte));
printf("0x%.2X", crc);
return 0;
}
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;
}发布于 2017-01-29 15:53:59
该表是单个字节0..255的crc8_slow(),没有初始和最终的独占-ors。该代码已经将POLY定义为0xb2,这是给定多项式(0x4d位相反)的反映。
对于不同的CRC-8定义,其初始寄存器值为零,并且没有最终的排他性--或者,只需从代码中删除两个独占-or。
您可以查看克拉卡尼来为任何给定的规范生成CRC代码。
https://stackoverflow.com/questions/41922021
复制相似问题