3

我正在尝试为 12 位 CRC 和算法做 crc_table,但总是得到错误的结果。

你能帮助我吗?要创建 crc 表,我尝试:

void crcInit(void)
{
    unsigned short  remainder;
    int    dividend;
    unsigned char  bit;

    for (dividend = 0; dividend < 256; ++dividend)
    {
        remainder = dividend << 4;

        for (bit = 8; bit > 0; --bit)
        {
            if (remainder & 0x800)
            {
                remainder = (remainder << 1) ^ 0x180D; //Polynomio of CRC-12
            }
            else
            {
                remainder = (remainder << 1);
            }
        }
       crcTable[dividend] = remainder;
    }

}

我更新了,CRC算法是:

unsigned short crcFast(unsigned char const message[], int nBytes)
{
    unsigned short remainder = 0x0000;
    unsigned char  data;
    int  byte;


    /*
     * Divide the message by the polynomial, a byte at a time.
     */
    for (byte = 0; byte < nBytes; ++byte)
    {
        data = message[byte] ^ (remainder >> 4);
    remainder = crcTable[data] ^ (remainder << 8);
    }

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

}

但它不起作用......

4

2 回答 2

3

这似乎不对:

if (remainder & 10000000)

看起来您打算将此数字设为二进制,但实际上是十进制。您应该改用十六进制文字 (0x80)。

这个数字似乎也有问题,而且你所做的移位大小也有问题:这个测试应该检查是否设置了余数的高位。由于您正在执行 12 位 CRC,因此掩码应为 0x800(二进制 100000000000)。上面的转变可能应该是:

remainder = dividend << 4;

设置余数的最左边 8 位。

于 2012-09-28T00:48:05.000 回答
1

Boost 库将具有已经实现的 CRC 校验和算法,它可以与不同的多项式一起用于除法和位数。使用此链接获取更多信息Boost CRC

我自己的一个示例实现是:

string data = "S95I";
boost::crc_optimal<11, 0x571> crc;
crc.process_bytes(data.data(), data.size());
stringstream checksum;
checksum << (int)crc() % 1296;
string resultCheck = checksum.str();

要使用 12 位的 CRC,您必须采用位数和使用的多项式,可在此处找到:Wikipedia CRC polynomials

于 2015-06-10T09:12:33.083 回答