CRC8算法澄清

时间:2017-01-29 14:33:49

标签: 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);

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位。

2 个答案:

答案 0 :(得分:2)

该表是单字节0..255的crc8_slow(),没有初始和最终的异或。该代码已将POLY定义为0xb2,这是给定多项式的反映(0x4d位反转)。

对于具有零初始寄存器值且没有最终异或的不同CRC-8定义,只需从代码中删除两个异或。

您可以查看crcany以生成任何给定规范的CRC代码。

答案 1 :(得分:1)

Poly0x14D反转,然后右移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;
}