CRC8算法说明

标签 c xor crc binary-operators

我偶然发现了这个 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/

相关文章:

ffmpeg 可以解析/解码 AVCC 格式的数据包吗?

c - malloc.c :3074 error?

c - 查找CRC-8计算表中使用的多项式

javascript - 了解初学者的循环冗余码算法

c - 为什么使用的数据类型为 'long long int' 与 'int' 时运行时间存在差异?

c - 实时任务(周期性任务)

string - Java字符串到字节数组回到字符串

c# - 我如何将此异或加密转换为 C#?

java - 异或的反函数是什么?

德尔福 5 到 2010