Почему расчет CRC16 такой медленный? - PullRequest
0 голосов
/ 15 мая 2018

У меня есть следующая функция 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;
}

Я пытался использовать его для вычисления CRC16 из файла размером около 800 Кб, но это занимает вечность, я имею в виду, через пять минут,значение i по-прежнему составляло около 2 000, и оно должно доходить до 800 000.

Может кто-нибудь дать мне объяснение, почему оно так медленно и что я могу сделать, чтобы решить эту проблему?

Я работаю с Visual Studio 2015 на процессоре i7, и компьютер не старый и не сломанный.

1 Ответ

0 голосов
/ 15 мая 2018

Замените первые строки на:

int i, j;
ushort crc = 0;

Вы использовали ushort для счетчика for, но если size> 65535, цикл for никогда не закончится.

Причина этого в том, что C # по умолчанию не генерирует исключение, если происходит переполнение, а просто "молча" игнорирует его.Проверьте следующий код для демонстрации:

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