在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

在C#上计算CRC-16时出现System.OverflowException

可能是在启用算术溢出检查的情况下构建的,但答案是假设情况并非如此。默认情况下,检查是禁用的,所以这种假设并不少见。

在有问题的代码中:

    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]));

然后溢出不再发生。