3

我正在寻找实现 CRC-8 校验和 - 在阅读 CRC 时,我遇到了 CCITT-16 的算法(多项式 X^16 + X^12 + X^5 + 1):

unsigned char ser_data;
static unsigned int crc;

crc  = (unsigned char)(crc >> 8) | (crc << 8);
crc ^= ser_data;
crc ^= (unsigned char)(crc & 0xff) >> 4;
crc ^= (crc << 8) << 4;
crc ^= ((crc & 0xff) << 4) << 1;

或者作为宏:

#define crc16(chk, byte)                                   \
        {                                                  \
          chk = (unsigned char) (chk >> 8) | (chk << 8);   \
          chk ^= byte;                                     \
          chk ^= (unsigned char)(chk & 0xFF) >> 4;         \
          chk ^= (chk << 8) << 4;                          \
          chk ^= ((chk & 0xFF) << 4) << 1;                 \
        }

我在这里有两个问题:

  1. 这个算法是如何从多项式推导出来的?
  2. CCITT8(多项式 X^8 + X^2 + X + 1)是否有类似的简单算法?
4

3 回答 3

3

请参阅此 CRC 错误检测算法的无痛指南

于 2012-04-03T17:44:18.013 回答
0

这是 CRC8-CCITT 的 C 实现,大致基于此答案(https://stackoverflow.com/a/15171925/1628701)中的代码:

uint8_t crc8_ccitt(uint8_t crc, const uint8_t *data, size_t dataLength){
    static const uint8_t POLY = 0x07;
    const uint8_t *end = data + dataLength;

    while(data < end){
        crc ^= *data++;
        crc = crc & 0x80 ? (crc << 1) ^ POLY : crc << 1;
        crc = crc & 0x80 ? (crc << 1) ^ POLY : crc << 1;
        crc = crc & 0x80 ? (crc << 1) ^ POLY : crc << 1;
        crc = crc & 0x80 ? (crc << 1) ^ POLY : crc << 1;
        crc = crc & 0x80 ? (crc << 1) ^ POLY : crc << 1;
        crc = crc & 0x80 ? (crc << 1) ^ POLY : crc << 1;
        crc = crc & 0x80 ? (crc << 1) ^ POLY : crc << 1;
        crc = crc & 0x80 ? (crc << 1) ^ POLY : crc << 1;
    }

    return crc;
}
于 2015-05-21T20:00:23.377 回答
0

this web page: https://decibel.ni.com/content/docs/DOC-11072 contains a link to a .zip file for each of the common (including the ones you ask for) algorithms for crc calculation.

于 2015-05-21T22:19:03.227 回答