C# 为什么CRC16计算如此缓慢?
我有以下CRC功能: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++) {
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;i crc^=(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#