Вчера начал работать с новыми изделиями нашей конторы, и как следствие с новым протоколом. В качестве контрольной суммы там используется CRC8 (раньше MD5 был).
Пользоваться сразу готовыми решениями не хотел, решил разобраться как этот CRC считается. Потратил кучу времени, но в основном всё понял. Написал свой алгоритм прям как в книжке. Побитовый. Всё работает, всё клёво :) Стал смотреть чужие алгоримы, и не могу понять как работает алгоритм orinoko. В том что он работает не сомневаюсь - результат совпадает.
Полином у нас используется X^8 + X^5 + X^4 + 1. Значение CRC перед вычислением инициализируется числом DE. Алгоритм и полином зеркальные (Т.е. использую функцию Rotate
Right With Carry и байт полинома перевернул).
Выкладываю три решения:
1) Моё. Берется первый байт, инициализируется числом DE. Из остального массива первый байт удаляется, а в конец дописывается нулевой байт (число нулей, по весу полинома). Запускаем цикл, который будет крутиться пока не кончатся байты. В цикле к нашему регистру по ходу сдвига постоянно добавляются биты из следующего байта. Смотрим выдвигаемый бит, если 1, то осуществляем XOR с полиномом.
2) Алгоритм orinoko, переделанный под мою задачу. Не могу понять как это работает... По сути каждый байт мы дописываем 8 нулями. Затем проходим по нему полиномом и считаем остаток как обычно. Затем беря следующий байт мы делаем XOR с остатком от предыдущего байта, и повторяем процедуру...
Считал на бумажке - действительно работает, а почему не пойму....
Допустим есть наши данные - два байта (10101100), (01000111) и инициализации нет
Стандартный алгоритм их слепит в одну строчку и дополнит нулями 101011000100011100000000, пройдет по этой строчке полиномом, посчитав остаток. Получим CRC.
Алгоритм orinoko возмет первый байт, дополнит 8 нулями 1010110000000000, пройдя полиномом посчитает остаток.
Возмет второй байт, сделает XOR с остатком с предыдущего шага. Полученный результат дополнит 8 нулями, пройдет полиномом, посчитает остаток и почему-то тоже получит CRC
3) Ну третий вариант - просто табличный. Взял кажется с ni.com. Работает быстро и проще всего.
Иногда лучше молчать и слыть идиотом, чем заговорить и развеять все сомнения.