-
Вложений: 1
Вычисление CRC
Планирую заменить в лоадере контрольную сумму на CRC, в связи с чем реализовал CRC-8/16/24/32/64. Обращаю внимание, что входные и выходные параметры у разных процедур передаются в разных регистрах.
Процедуры не оптимизированные, но правильные (проверял по контрольным значениям). Может кто-нибудь оптимизирует или даст ссылку на более эффективные варианты.
- - - Добавлено - - -
Дополню - здесь вычисление без таблиц, вычисление crc-32 по таблице есть, например, в эксисайзере (и я эту процедуру потом использовал в тестах).
- - - Добавлено - - -
Если известна максимальная длина фрагмента данных и требуемая обнаруживающая способность, то можно выбрать подходящий полином здесь. Только надо учесть, что в таблице полиномы записаны в неполном виде, если дальше прощелкать, там есть и "полные" варианты, или можно самим дополнить.
- - - Добавлено - - -
В crc32 и 64 можно убрать push h и pop h
-
Вложений: 1
Оптимизировал crc32, стало короче почти на 30 байт и быстрее более чем в полтора раза.
- - - Добавлено - - -
Но все равно медленно. Для размеров файлов до нескольких десятков Кб надо использовать как минимум crc24 и все же придется считать с использованием таблиц.
-
Вычисление crc24 с использованием таблицы. Для сокращения программы таблица рассчитывается процедурой, а не задается массивом.
Быстрее безтабличного варианта в 5 с лишним раз - 45 Кб пробегает за 2 с копейками секунды. Если скорость не очень важна (но все же хочется считать по таблице), то можно сократить процедуру, заменив проверку счетчика на традиционную и убрав "вторую серию".
-
Вложений: 1
Вернулся к crc, посмотрел табличный вариант из предыдущего поста, устыдился и решил оптимизировать. Новый табличный CRC24 на 37 байт короче и чуть быстрее. Еще добавил табличный CRC16.