Циклический избыточный код
Алгоритм CRC базируется на свойствах деления с остатком двоичных многочленов, т.е. хэш-функция является по сути остатком от деления многочлена, соответствующего входным данным, на некий фиксированный порождающий многочлен.
Каждому конечному двоичному набору данных alt=»<\displaystyle a_<0>,a_<1>,\dots ,a_
Как узнать контрольную сумму файла в Windows


При закачке или переносе любого файла, особенно большого, всегда есть шанс, что он повредится. И самый простой способ узнать, цел ли файл — это сравнить его контрольную сумму у себя на компьютере и на ресурсе, откуда вы этот файл скачали.
Для того, чтобы узнать контрольную сумму, введите в PowerShell команду Get-FileHash ПутьДоФайла -Algorithm Тип | Format-List . PowerShell поддерживает достаточно много алгоритмов — это SHA256, MD5, SHA1, SHA384, SHA512, MACTripleDES и RIPEMD160.
К примеру, нужно узнать контрольную сумму по алгоритму MD5 текстового файла с именем 1.txt в корне диска C. Команда будет выглядеть как Get-FileHash C:\1.txt -Algorithm MD5 | Format-List :
Теперь, сверив свой MD5 с тем, что указан на сайте для файла, можно точно узнать, повредился ли он при закачке или нет.
CRC32: на STM32 как на компе или на компе как на STM32.

Вычисление CRC как на CRC блоке STM32:
Тут я применил htonl чтоб байты в слове были в определённом порядке независимо от LE/BE: сначала в LSFR заправляется байт, который лежит в памяти по смещению 3 (как на рисунке). Ещё, остаток сообщения, не влезающий в 4х-байтовое слово дополняется нулями справа и CRC досчитвается дальше.
Можно писать конструкцию типа такой (вычислять CRC кусками):
Вот то, что получается:
crc32_byte(«123456789») = CBF43926
crc32_stm32(«123456789») = 500E6FA8
crc32_byte(«12345678») = 9AE0DAAF
crc32_stm32(«12345678») = 0103AB06
Теперь код для STM32:
Сперва чисто хардварная CRC (ей соответствует софтовая crc32_stm32):
Далее сделаем «как на софте», или «как в ethernet». Благо, в ARM есть инструкция для реверсирования бит.
Но это не всё. Ведь если пораскинуть мозгами, то можно добавить вкусную плюшку — сосчитать-таки побайтовую CRC на аппаратном блоке.
Нужно просто вычислить полином-остаток от оставшегося куска и добавить его к уже посчитанной пословно CRC. Остаток — это по сути та же CRC, но с начальным состоянием LSFR=0 (см инициализацию таблицы остатков). Но вот беда — CRC_ResetDR может установить регистр CRC только в 0xFFFFFFFF. Слава яйцам, что нам надо именно 0, а не что-то ещё. Одно из свойств CRC состоит в том, что если к сообщению приписать его CRC, то CRC нового сообщения будет равна 0. Другими словами, если мы подадим в регистр CRC то, что мы из него считали, то в результате получится 0. Теперь осталось заправить в регистр кусочек из одного, двух или трёх оставшихся байт — et voila, забираем наш полином-остаток и добавляем его к CRC.
Ниже код: