Crc32 как посчитать контрольную сумму
Перейти к содержимому

Crc32 как посчитать контрольную сумму

Циклический избыточный код

Алгоритм CRC базируется на свойствах деления с остатком двоичных многочленов, т.е. хэш-функция является по сути остатком от деления многочлена, соответствующего входным данным, на некий фиксированный порождающий многочлен.

Каждому конечному двоичному набору данных alt=»<\displaystyle a_<0>,a_<1>,\dots ,a_>» width=»» height=»» /> взаимооднозначно сопоставляется двоичный многочлен alt=»<\displaystyle \sum _<0\leq n\leq N>a_x^>» width=»» height=»» />, последовательность коэффициентов которого представляет из себя исходную последовательность. Например, десятичное число 90 (1011010 в двоичной записи) соответствует многочлену:

<\displaystyle P(x)=1\cdot x^<6>+0\cdot x^<5>+1\cdot x^<4>+1\cdot x^<3>+0\cdot x^<2>+1\cdot x^<1>+0\cdot x^<0>=x^<6>+x^<4>+x^<3>+x^<1>>» width=»» height=»» /></p>
<p>Подобным же образом в виде двоичного многочлена может быть представлен любой из блоков обрабатываемых данных, и любой двоичный многочлен обращается в набор битов. Нетрудно видеть, что количество различных многочленов степени меньше <i>N</i> равно <img decoding=

Как узнать контрольную сумму файла в Windows

Егор

CheckISOmd5-logo.png

При закачке или переносе любого файла, особенно большого, всегда есть шанс, что он повредится. И самый простой способ узнать, цел ли файл — это сравнить его контрольную сумму у себя на компьютере и на ресурсе, откуда вы этот файл скачали.

Для того, чтобы узнать контрольную сумму, введите в 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 :

Снимок.PNG

Теперь, сверив свой 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.
Ниже код:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *