Ответ:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено CD_Eater 04 февраля 2005 г. 05:55
В ответ на: хм..... недоконца понял.... простой примерчик на цифрах не приведете ? ;) отправлено ~whale~ 04 февраля 2005 г. 03:08

A, B, C - исходные байты

Инициализация:
S1 = 0
S2 = 0
(я использую ненулевые псевдослучайные константы, например, свой год рождения)

Шаг:
S1 := S1 + байт сообщения
S2 := S2 + S1

Итого:

Шаг 1:
S1 = A
S2 = A
Шаг 2:
S1 = A + B
S2 = A + (A + B)
Шаг 3:
S1 = A + B + C
S2 = A + (A + B) + (A + B + C)
= 3A + 2B + C

Разумеется, всё числа - по модулю 255

Результат (последовательсть байт S1, S2) я обычно немного видоизменяю:
S1, S2+1
Тогда первое число из интервала 0..254, а второе - из интервала 1..255, поэтому числа $0000 и $FFFF не будут правильными контрольными суммами ни для какой последовательности - полезная фича.


Вычисляется намного быстрее CRC-16, потому что не требует 8 сдвигов для каждого байта сообщения, а только 2 сложения. Сложение по модулю 255 - это просто прибавление переноса к результату. И в самом конце проверить, что результат не равен 255 (иначе заменить на 0).

Удивительно, почему эта контрольная сумма не стала стандартом для обработки на МК и почему иногда используется CRC-16. Немного видоизменив алгоритм, можно получить хорошую контрольную сумму для 8 бит (с помощью финальной операции над S1 и S2, например (S1 xor Const) + S2), для 32 бит (с помощью расширения модуля 255 до 65535 и выполняя операции над словами).

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru