为什么CRC16计算如此慢?

时间:2018-05-15 09:13:47

标签: c# crc crc16

我有以下CRC功能:

public static ushort ComputeCRC16(byte[] data)
{
    ushort i, j, crc = 0;
    int size = data.Length;

    for (i = 0; i < size - 2; i++)
    {
        crc ^= (ushort)(data[i] << 8);

        for (j = 0; j < 8; j++)
        {
            if ((crc & 0x8000) != 0) /* Test for bit 15 */
            {
                crc = (ushort)((crc << 1) ^ 0x1234); /* POLYNOMIAL */
            }
            else
            {
                crc <<= 1;
            }
        }
    }

    return crc;
}

我一直试图用它来计算一个大约800 Kb的文件的CRC16,但它需要永远,我的意思是在五分钟后,i的值仍然在2 000左右,并且它应该达到80万。

有人可以解释为什么它如此缓慢以及我可以做些什么来解决这个问题?

我正在使用i7处理器上的Visual Studio 2015,而且计算机不老也不坏。

1 个答案:

答案 0 :(得分:6)

将第一行替换为:

int i, j;
ushort crc = 0;

您使用ushort for计数器,但如果size&gt; 65535,for周期永远不会结束。

这样做的原因是,如果发生溢出,C#默认不会抛出异常但只是“默默地”忽略它。查看以下代码以进行演示:

ushort i = ushort.MaxValue; //65535  
i++; //0