CRC表查找优化如何工作?

时间:2018-09-07 19:48:55

标签: crc crc32

我试图通过以下内容来了解​​CRC表查找的优化:http://www.sunshine2k.de/articles/coding/crc/understanding_crc.html#ch5,尤其是:

public static ushort Compute_CRC16(byte[] bytes)
{
    ushort crc = 0;
    foreach (byte b in bytes)
    {
        /* XOR-in next input byte into MSB of crc, that's our new intermediate divident */
        byte pos = (byte)( (crc >> 8) ^ b); /* equal: ((crc ^ (b << 8)) >> 8) */
        /* Shift out the MSB used for division per lookuptable and XOR with the remainder */
        crc = (ushort)((crc << 8) ^ (ushort)(crctable16[pos]));
    }
    return crc;
}

我确实了解基本的逐位方法,也了解查找方法,但是我很难理解这一点:

crc = (ushort)((crc << 8) ^ (ushort)(crctable16[pos])); 为什么现有的crc需要转移?为什么这个技巧起作用?它是基于什么的?

谢谢。

PS:是的,我读了这个线程:How is a CRC32 checksum calculated?(这不是一个骗子,因为它描述了基本方法)

1 个答案:

答案 0 :(得分:2)

这是左移CRC的示例。数据的一个字节与CRC的高位字节进行异或。要进行表查找(对数组进行索引),需要将结果右移,或者可以先将CRC的高位字节右移,然后对一个字节的数据进行XOR运算以产生新的中间高位字节CRC的循环,则必须将其循环8次以产生将CRC循环8次的结果,或者可以针对所有256个可能的8位值预先完成此操作,以生成表并可以使用表查找而不是骑自行车8次。循环之后,低位字节将需要向左移动,因此您将得到显示的代码。

左移CRC类似于二进制的长手除法,使用CRC多项式作为除数,并将数据作为长除数,不同之处在于使用XOR代替减法,最后的余数是CRC 。事实证明,一次对8个数据(股息)位进行XOR运算不会影响结果,因为每个商位仅基于CRC多项式的最高有效位和当前工作除数的最高有效位(数据),从而可以优化使用表查找的功能。