PDA

Просмотр полной версии : Вычисление CRC



ivagor
09.03.2016, 15:25
Планирую заменить в лоадере контрольную сумму на CRC, в связи с чем реализовал CRC-8/16/24/32/64. Обращаю внимание, что входные и выходные параметры у разных процедур передаются в разных регистрах.
Процедуры не оптимизированные, но правильные (проверял по контрольным значениям). Может кто-нибудь оптимизирует или даст ссылку на более эффективные варианты.

- - - Добавлено - - -

Дополню - здесь вычисление без таблиц, вычисление crc-32 по таблице есть, например, в эксисайзере (и я эту процедуру потом использовал в тестах).

- - - Добавлено - - -

Если известна максимальная длина фрагмента данных и требуемая обнаруживающая способность, то можно выбрать подходящий полином здесь (https://users.ece.cmu.edu/~koopman/crc/). Только надо учесть, что в таблице полиномы записаны в неполном виде, если дальше прощелкать, там есть и "полные" варианты, или можно самим дополнить.

- - - Добавлено - - -

В crc32 и 64 можно убрать push h и pop h

ivagor
11.03.2016, 22:01
Оптимизировал crc32, стало короче почти на 30 байт и быстрее более чем в полтора раза.

- - - Добавлено - - -

Но все равно медленно. Для размеров файлов до нескольких десятков Кб надо использовать как минимум crc24 и все же придется считать с использованием таблиц.

ivagor
12.03.2016, 19:38
Вычисление crc24 с использованием таблицы. Для сокращения программы таблица рассчитывается процедурой, а не задается массивом.
Быстрее безтабличного варианта в 5 с лишним раз - 45 Кб пробегает за 2 с копейками секунды. Если скорость не очень важна (но все же хочется считать по таблице), то можно сократить процедуру, заменив проверку счетчика на традиционную и убрав "вторую серию".

ivagor
02.05.2022, 11:07
Вернулся к crc, посмотрел табличный вариант из предыдущего поста, устыдился и решил оптимизировать. Новый табличный CRC24 на 37 байт короче и чуть быстрее. Еще добавил табличный CRC16.