首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CRC8算法的澄清

CRC8算法的澄清
EN

Stack Overflow用户
提问于 2017-01-29 14:33:48
回答 2查看 6.2K关注 0票数 0

我偶然发现了8位CRC:https://stackoverflow.com/a/15171925/243827的实现。

有人能说明一下那张桌子是怎么弄来的吗?我取消了crc8_slow函数的注释,并尝试用

代码语言:javascript
复制
  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

代码语言:javascript
复制
#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位,如果这是重要的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-29 16:54:43

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
#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;
}
票数 1
EN

Stack Overflow用户

发布于 2017-01-29 15:53:59

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

对于不同的CRC-8定义,其初始寄存器值为零,并且没有最终的排他性--或者,只需从代码中删除两个独占-or。

您可以查看克拉卡尼来为任何给定的规范生成CRC代码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41922021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档