CRC代码和实现兼容性

时间:2017-01-31 15:52:48

标签: c embedded

CRC校验和的机制或步骤很简单,但软件在某种程度上complicated并且软件中有一些步骤与CRC的步骤不兼容 以下图片是获取CRC校验和的步骤(仅为模2分区):

校验和是余数= 001
用于计算CRC校验和的软件用于一串位:

/*
 * The width of the CRC calculation and result.
 * Modify the typedef for a 16 or 32-bit CRC standard.
 */
typedef uint8_t crc;

#define WIDTH  (8 * sizeof(crc))
#define TOPBIT (1 << (WIDTH - 1))

crc
crcSlow(uint8_t const message[], int nBytes)
{
    crc  remainder = 0; 


    /*
     * Perform modulo-2 division, a byte at a time.
     */
    for (int byte = 0; byte < nBytes; ++byte)
    {
        /*
         * Bring the next byte into the remainder.
         */
        remainder ^= (message[byte] << (WIDTH - 8));

        /*
         * Perform modulo-2 division, a bit at a time.
         */
        for (uint8_t bit = 8; bit > 0; --bit)
        {
            /*
             * Try to divide the current data bit.
             */
            if (remainder & TOPBIT)
            {
                remainder = (remainder << 1) ^ POLYNOMIAL;
            }
            else
            {
                remainder = (remainder << 1);
            }
        }
    }

    /*
     * The final remainder is the CRC result.
     */
    return (remainder);

}

我发现part( remainder<<1 )中的软件不兼容,因为即使后续位不为0,移位也总是在右边加0。

以及部分内容: remainder ^= (message[byte] << (WIDTH - 8));

当放置第一个字节时我没有看到问题,因为初始值是因为初始值是0,但是当插入下一个字节时为什么我们用前一个余数xor它们的每个字节

1 个答案:

答案 0 :(得分:0)

代码示例似乎使用可变大小的CRC,其中CRC的大小是WIDTH。 POLYNOMIAL是WIDTH + 1位多项式的底部WIDTH位,它将最低有效位设置为1.由于操作是XOR,数据位与剩余部分进行异或的顺序无关紧要,因此,8个数据位可以同时与剩余部分的高位进行异或。然后,在时间反馈周期的位发生8位。由于POLYNOMIAL的最低位为1,只要数据中有1位,就会保持循环。