为什么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
我有以下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