[an error occurred while processing this directive]
Коллеги! Я думаю многие знают алгоритм вычисления CRC. Вот сижу разбираюсь с чужой прогой(+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено bialix 28 февраля 2003 г. 13:44

вижу алгоритм вычисления CRC. Вижу, что какой-то он нестандартный, или это у меня в голове глюк? Но по-моему ТАК CRC не вычисляют (по-крайней мере в классике)
Перевод на русский язык с ассемблера 51:

вычисляем на ходу при приеме/передаче данных по УАРТ (тут все пока честно)

начальное значение = 0х0000
образующий полином = 0х1021 (тожа пока все честно)

затем пошел алгоритм - по байту берем и вычисляем
1. операция xor между новым байтом (byte) и старшим байтом CRC (crc_h) - получаем некий индекс (index)
2. на основании index (индекс массива) из таблицы берем табличный старший байт (table_h)
3. делаем операцию xor между table_h и младшим байтом CRC (crc_l). Полученный результат кладем в crc_h
4. На основе index из таблицы берем табличный младший байт (table_l) и кладем его в младший байт CRC (crc_l).

И так пока байты (byte) не кончатся. Короче я всегда считал, что любой алгоритм хоть побитовый, хоть табличный, работает по принципу сдвига данных, причем новые данные вдвигаются в буфер CRC, а старые - выдвигаются из него и на основании выдвинутых данных производятся действия по xor.

Выскажитесь пожалуйста по-существу вопроса, а то я понимаю, что этот чужой код идеологически неверен, но берут сомнения в своей правоте.

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

Ответы



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

E-mail: info@telesys.ru