C# 为什么CRC16计算如此缓慢?

C# 为什么CRC16计算如此缓慢?,c#,crc,crc16,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++) {

我有以下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;
}
公共静态ushort计算CRC16(字节[]数据)
{
ushort i,j,crc=0;
int size=data.Length;
对于(i=0;icrc^=(ushort)(数据[i]将第一行替换为:

int i, j;
ushort crc = 0;
您对
for
计数器使用了
ushort
,但如果
size
>65535,则
for
周期将永远不会结束

原因是,如果发生溢出,默认情况下C#不会引发异常,而只是“静默”忽略它。请检查以下代码以进行演示:

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

将第一行替换为:

int i, j;
ushort crc = 0;
您对
for
计数器使用了
ushort
,但如果
size
>65535,则
for
周期将永远不会结束

原因是,如果发生溢出,默认情况下C#不会引发异常,而只是“静默”忽略它。请检查以下代码以进行演示:

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


什么是
Ko
?我认为编译器使优化过于复杂,代码看起来足够可靠;尝试添加
[MethodImpl(methodimpoptions.aggressiveinline)]
对于该函数,它可能会有所帮助。我看不出有任何问题,这会导致速度如此之慢。在标准实现中,使用预构建表,一次处理整个字节(不是像这里这样按位处理)。当前实现应该很慢,但我并没有这么慢。@the General Kb,抱歉,这里是法语国家(o代表八位字节,意思是字节)@zedling我不确定这会起到多大作用什么是
Ko
?我认为编译器使优化过于复杂,代码看起来足够可靠;尝试添加
[MethodImpl(MethodImplOptions.aggressiveinline)]
对于该函数,它可能会有所帮助。我看不出有任何问题,这会导致速度如此之慢。在标准实现中,使用预构建表,一次处理整个字节(不是像这里这样按位处理)。当前实现应该很慢,但我并没有这么慢。@the General Kb,抱歉,这里是法语国家(o代表八位字节,表示字节)@zedling我一点也不确定这会有多大作用该死,我们错过了默认未检查的荣耀我现在真的觉得很愚蠢,但不知道默认为未检查…我再次使用检查并得到了溢出…谢谢anyway@MartinVerjans你来自VB.NET吗?因为我认为这是默认的…@Freggar是的,实际上,有几个月自从我回到C#该死,我们错过了默认未检查的荣耀我现在真的觉得很愚蠢,但不知道默认未检查…我再次使用检查并得到一个溢出…谢谢anyway@MartinVerjans你来自VB.NET吗?因为我认为这是默认的…@Freggar是的,事实上,我是bac的几个月后k到C#