Полином для CRC32:
х 32 + х 26 + х 23 + х 22 + х 16 + х 12 + х 11 + х 10 + х 8 + х 7 + х 5 + х 4 + х 2 + х + 1
Или в шестнадцатеричном и двоичном формате:
0x 01 04 C1 1D B7
1 0000 0100 1100 0001 0001 1101 1011 0111
Наивысший член (x 32 ) обычно явно не записывается, поэтому вместо этого он может быть представлен в шестнадцатеричном формате так же, как
0x 04 C1 1D B7
Не стесняйтесь подсчитывать единицы и нули, но вы обнаружите, что они совпадают с полиномом, где 1
бит 0 (или первый бит) иx
бит 1 (или второй бит).
Почему этот многочлен? Потому что должен быть стандарт заданного многочлена, а стандарт был установлен IEEE 802.3. Также чрезвычайно сложно найти многочлен, который эффективно обнаруживает различные битовые ошибки.
Вы можете думать о CRC-32 как о серии «двоичной арифметики без переносов» или, по сути, «операций XOR и сдвига». Технически это называется полиномиальной арифметикой.
Чтобы лучше понять это, представьте себе это умножение:
(x^3 + x^2 + x^0)(x^3 + x^1 + x^0)
= (x^6 + x^4 + x^3
+ x^5 + x^3 + x^2
+ x^3 + x^1 + x^0)
= x^6 + x^5 + x^4 + 3*x^3 + x^2 + x^1 + x^0
Если мы предположим, что x является основанием 2, мы получим:
x^7 + x^3 + x^2 + x^1 + x^0
Зачем? Поскольку 3x ^ 3 равно 11x ^ 11 (но нам нужна только 1 или 0 предварительная цифра), мы переносим:
=1x^110 + 1x^101 + 1x^100 + 11x^11 + 1x^10 + 1x^1 + x^0
=1x^110 + 1x^101 + 1x^100 + 1x^100 + 1x^11 + 1x^10 + 1x^1 + x^0
=1x^110 + 1x^101 + 1x^101 + 1x^11 + 1x^10 + 1x^1 + x^0
=1x^110 + 1x^110 + 1x^11 + 1x^10 + 1x^1 + x^0
=1x^111 + 1x^11 + 1x^10 + 1x^1 + x^0
Но математики изменили правила так, что это mod 2. Таким образом, в основном любой двоичный полином по модулю 2 - это просто сложение без переноса или XOR. Итак, наше исходное уравнение выглядит так:
=( 1x^110 + 1x^101 + 1x^100 + 11x^11 + 1x^10 + 1x^1 + x^0 ) MOD 2
=( 1x^110 + 1x^101 + 1x^100 + 1x^11 + 1x^10 + 1x^1 + x^0 )
= x^6 + x^5 + x^4 + 3*x^3 + x^2 + x^1 + x^0 (or that original number we had)
Я знаю, что это прыжок веры, но это выходит за рамки моих возможностей как линейного программиста. Если вы заядлый студент или инженер в области компьютерных наук, я призываю вас разбить это на части. Этот анализ принесет пользу всем.
Итак, чтобы проработать полный пример:
Original message : 1101011011
Polynomial of (W)idth 4 : 10011
Message after appending W zeros : 11010110110000
Теперь мы разделим расширенное сообщение на Poly, используя арифметику CRC. Это то же деление, что и раньше:
1100001010 = Quotient (nobody cares about the quotient)
_______________
10011 ) 11010110110000 = Augmented message (1101011011 + 0000)
=Poly 10011,,.,,....
-----,,.,,....
10011,.,,....
10011,.,,....
-----,.,,....
00001.,,....
00000.,,....
-----.,,....
00010,,....
00000,,....
-----,,....
00101,....
00000,....
-----,....
01011....
00000....
-----....
10110...
10011...
-----...
01010..
00000..
-----..
10100.
10011.
-----.
01110
00000
-----
1110 = Remainder = THE CHECKSUM!!!!
Деление дает частное, которое мы отбрасываем, и остаток, который является вычисленной контрольной суммой. На этом расчет заканчивается. Обычно контрольная сумма затем добавляется к сообщению и передается результат. В этом случае передача будет: 11010110111110.
Используйте только 32-битное число в качестве делителя и используйте весь поток в качестве дивиденда. Выбросьте частное и оставьте остаток. Добавьте остаток в конец сообщения, и у вас будет CRC32.
Средний отзыв парня:
QUOTIENT
----------
DIVISOR ) DIVIDEND
= REMAINDER
- Возьмите первые 32 бита.
- Биты сдвига
- Если 32 бита меньше DIVISOR, перейдите к шагу 2.
- XOR 32 бита от DIVISOR. Переходите к шагу 2.
(Обратите внимание, что поток должен быть разделен на 32 бита или должен быть дополнен. Например, 8-битный поток ANSI должен быть дополнен. Также в конце потока деление останавливается.)
0xEDB88320
также можно записать msbit-first ( нормальный ) как0x04C11DB7
. Были ли значения таблицы, которые вы нашли в другом месте, были сгенерированы с использованием того же полинома CRC?