为什么CRC16计算这么慢?

Why is CRC16 calculation so slow?

我有以下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 左右,它应该会上升到 800 000。

谁能解释一下为什么它这么慢以及我能做些什么来解决这个问题?

我在 i7 处理器上使用 Visual Studio 2015,计算机既不旧也不坏。

将第一行替换为:

int i, j;
ushort crc = 0;

您使用 ushort 作为 for 计数器,但如果 size > 65535,for 循环将永远不会结束。

原因是 C# 在默认情况下不会在发生溢出时抛出异常,只是 "silently" 会忽略它。查看以下代码进行演示:

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