在C#上计算CRC-16时出现System.OverflowException
本文关键字:System OverflowException CRC-16 计算 | 更新日期: 2023-09-27 18:21:32
我试图使用此答案中提供的代码,但在byte index = (byte)(crc ^ bytes[i]);
行上收到System.OverflowException。
这发生在第一个非零字节之后的下一次迭代中。我不知道该查什么。
提前谢谢。
SharpDevelop版本:5.1.0.5134-RC-d5052dc5
.NET版本:4.6.00079
操作系统版本:Microsoft Windows NT 6.3.9600.0
可能是在启用算术溢出检查的情况下构建的,但答案是假设情况并非如此。默认情况下,检查是禁用的,所以这种假设并不少见。
在有问题的代码中:
public static ushort ComputeChecksum(byte[] bytes)
{
ushort crc = 0;
for (int i = 0; i < bytes.Length; ++i)
{
byte index = (byte)(crc ^ bytes[i]);
crc = (ushort)((crc >> 8) ^ table[index]);
}
return crc;
}
crc
是一个无符号短,而index
是一个字节,因此(crc ^ bytes[i])
可能明显大于255,并在检查环境中使转换为byte
溢出。
如果我将行更改为明确的unchecked
:
byte index = unchecked((byte)(crc ^ bytes[i]));
然后溢出不再发生。