CRC8算法说明
CRC8 algorithm clarifications
我偶然发现了这个 8 位 CRC 的实现:
有人可以阐明 table 是如何获得的吗?我已经取消注释 crc8_slow
函数并尝试用
喂养它
byte crc;
byte data[1] = {0x01};
crc = crc8_slow(0, data, sizeof(data)/sizeof(byte));
printf("0x%.2X", crc);
for POLY
定义为 4d、d4、a6 或 b2。我似乎无法重现 table 的价值。另外,我需要如何为移位寄存器的非 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 位。
table 是单个字节 0..255 的 crc8_slow(),没有首尾 exclusive-ors。该代码已经将 POLY
定义为 0xb2
,这是给定多项式的反映(0x4d
位反转)。
对于具有零初始寄存器值且没有最终 exclusive-or 的不同 CRC-8 定义,只需从代码中删除两个 exclusive-ors。
您可以查看 crcany 以生成任何给定规范的 CRC 代码。
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;
}
我偶然发现了这个 8 位 CRC 的实现:
有人可以阐明 table 是如何获得的吗?我已经取消注释 crc8_slow
函数并尝试用
byte crc;
byte data[1] = {0x01};
crc = crc8_slow(0, data, sizeof(data)/sizeof(byte));
printf("0x%.2X", crc);
for POLY
定义为 4d、d4、a6 或 b2。我似乎无法重现 table 的价值。另外,我需要如何为移位寄存器的非 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 位。
table 是单个字节 0..255 的 crc8_slow(),没有首尾 exclusive-ors。该代码已经将 POLY
定义为 0xb2
,这是给定多项式的反映(0x4d
位反转)。
对于具有零初始寄存器值且没有最终 exclusive-or 的不同 CRC-8 定义,只需从代码中删除两个 exclusive-ors。
您可以查看 crcany 以生成任何给定规范的 CRC 代码。
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;
}