Поліном для CRC32:
x 32 + x 26 + x 23 + x 22 + x 16 + x 12 + x 11 + x 10 + x 8 + x 7 + x 5 + x 4 + x 2 + x + 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, але ви виявите, що вони збігаються з поліномом, де 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
Якщо ми припустимо, що х - основа 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. Отже, в основному будь-який двійковий поліном mod 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)
Я знаю, що це стрибок віри, але це виходить за рамки моїх можливостей програміста ліній. Якщо ви твердий студент CS або інженер, я кидаю виклик це розбити. Кожен виграє від цього аналізу.
Отже, щоб опрацювати повний приклад:
Original message : 1101011011
Polynomial of (W)idth 4 : 10011
Message after appending W zeros : 11010110110000
Тепер ми ділимо доповнене повідомлення на полі, використовуючи арифметику 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?