我偶然发现了这种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。如果有关系的话,我在一个8位的Atmega上。

最佳答案

Poly反转,然后右移1位得到0x14D。crc是0xB2,它使用右移位而不是左移位。

101001101      0x14d
101100101      0x14d bit reversed = 0x165
 10110010      0x14d bit reversed >> 1 = 0xB2

如果你看bit reflected,你会看到一个crc8_table[0x80]。每行有12个字节长,由于index0xB2是十进制的,所以请查看以0x80开头的第10行,并查看字节8(该行的第一个字节是120),以查看128
我测试了这个代码,它打印了一个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;
}

关于c - CRC8算法澄清,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41922021/

10-12 15:04