实现特定多项式的CRC。多项式与代码中使用的多项式有什么关系?

实现特定多项式的CRC。多项式与代码中使用的多项式有什么关系?,c,crc,C,Crc,我有以下CRC功能: #define CRC8INIT 0x00 #define CRC8POLY 0x18 //0X18 = X^8+X^5+X^4+X^0 // ---------------------------------------------------------------------------- uint8_t crc8 (uint8_t *data, uint16_t number_of_bytes_in_data) {

我有以下CRC功能:

#define CRC8INIT    0x00
#define CRC8POLY    0x18              //0X18 = X^8+X^5+X^4+X^0

// ----------------------------------------------------------------------------

uint8_t crc8 (uint8_t *data, uint16_t number_of_bytes_in_data)
{
    uint8_t  crc;
    uint16_t loop_count;
    uint8_t  bit_counter;
    uint8_t  b;
    uint8_t  feedback_bit;

    crc = CRC8INIT;

    for (loop_count = 0; loop_count != number_of_bytes_in_data; loop_count++) {
        b = data[loop_count];
        bit_counter = 8;

        do {
            feedback_bit = (crc ^ b) & 0x01;

            if (feedback_bit == 0x01) {
                crc = crc ^ CRC8POLY;
            }

            crc = (crc >> 1) & 0x7F;

            if (feedback_bit == 0x01) {
                crc = crc | 0x80;
            }

            b = b >> 1;
            bit_counter--;

        } while (bit_counter > 0);
    }

    return crc;
}
0x18与多项式X^8+X^5+X^4+X^0的关系如何

X^8+X^5+X^4+X^0=100110001

0x18=00011000


如果我将CRC8POLY定义为0xEA(我已经看到了这一点),那么它将代表什么多项式呢?

CRC代码编写得相当奇怪,其中多项式应用于两个不同的位置,分解位。也就是说,在
crc=crc^CRCPOLY
和有条件地
crc=crc|0x80
。通常写得更像这样:

unsigned crc8(unsigned char const *dat, size_t len) {
    unsigned crc = 0;
    for (size_t i = 0; i < len; i++) {
        crc ^= dat[i];
        for (int k = 0; k < 8; k++)
            crc = crc & 1 ? (crc >> 1) ^ 0x8c : crc >> 1;
    }
    return crc;
}
unsigned crc8(unsigned char const*dat,size\t len){
无符号crc=0;
对于(大小i=0;i>1)^0x8c:crc>>1;
}
返回crc;
}

其中,
0x8c
是多项式反转,没有x8项。

CRC码写得相当奇怪,多项式应用于两个不同的位置,将位分解。也就是说,在
crc=crc^CRCPOLY
和有条件地
crc=crc|0x80
。通常写得更像这样:

unsigned crc8(unsigned char const *dat, size_t len) {
    unsigned crc = 0;
    for (size_t i = 0; i < len; i++) {
        crc ^= dat[i];
        for (int k = 0; k < 8; k++)
            crc = crc & 1 ? (crc >> 1) ^ 0x8c : crc >> 1;
    }
    return crc;
}
unsigned crc8(unsigned char const*dat,size\t len){
无符号crc=0;
对于(大小i=0;i>1)^0x8c:crc>>1;
}
返回crc;
}
其中,
0x8c
是多项式的倒数,没有x8项

0x18与多项式X^8+X^5+X^4+X^0的关系如何

由于该代码是右移CRC,每个字节的“最高有效位”是位0,而不是位7。多边形需要从100110001反转为100011001,即0x119,右移位后,0x119的位0被移位,因此可以使用0x118。如果反馈位为1,则代码使用第二个if语句to或in(0x100)>>1==0x80。作为替代方案,由于反馈_位是0或1,因此(0-feeback_位)可以用作多边形的掩码(假设两个的补码数学),而不是使用if语句

typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
#define CRC8INIT 0x00
#define CRC8POLY 0x8c   // 0x119 >> 1

uint8_t crc8 (uint8_t *data, uint16_t number_of_bytes_in_data)
{
    uint8_t  crc;
    uint16_t loop_count;
    uint8_t  bit_counter;
    uint8_t  b;
    uint8_t  feedback_bit;

    crc = CRC8INIT;

    for (loop_count = 0; loop_count != number_of_bytes_in_data; loop_count++) {
        b = data[loop_count];
        bit_counter = 8;
        do {
            feedback_bit = (crc ^ b) & 0x01;
            crc = (crc >> 1) ^ ((0-feedback_bit) & CRC8POLY);
            b = b >> 1;
            bit_counter--;
        } while (bit_counter > 0);
    }

    return crc;
}
0x18与多项式X^8+X^5+X^4+X^0的关系如何

由于该代码是右移CRC,每个字节的“最高有效位”是位0,而不是位7。多边形需要从100110001反转为100011001,即0x119,右移位后,0x119的位0被移位,因此可以使用0x118。如果反馈位为1,则代码使用第二个if语句to或in(0x100)>>1==0x80。作为替代方案,由于反馈_位是0或1,因此(0-feeback_位)可以用作多边形的掩码(假设两个的补码数学),而不是使用if语句

typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
#define CRC8INIT 0x00
#define CRC8POLY 0x8c   // 0x119 >> 1

uint8_t crc8 (uint8_t *data, uint16_t number_of_bytes_in_data)
{
    uint8_t  crc;
    uint16_t loop_count;
    uint8_t  bit_counter;
    uint8_t  b;
    uint8_t  feedback_bit;

    crc = CRC8INIT;

    for (loop_count = 0; loop_count != number_of_bytes_in_data; loop_count++) {
        b = data[loop_count];
        bit_counter = 8;
        do {
            feedback_bit = (crc ^ b) & 0x01;
            crc = (crc >> 1) ^ ((0-feedback_bit) & CRC8POLY);
            b = b >> 1;
            bit_counter--;
        } while (bit_counter > 0);
    }

    return crc;
}
参考,它是达拉斯单线芯片中使用的crc8实现。请注意,polinomial可以用正规表示、反向表示、倒数表示和反向倒数表示(另请参见)。看起来,它是反向倒数表示,省略了最高位。

指的是达拉斯单线芯片中使用的crc8实现。请注意,polinomial可以用正规表示、反向表示、倒数表示和反向倒数表示(另请参见)。看起来,这是一种反向倒数表示,省略了最高位