Polinomial untuk CRC32 adalah:
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
Atau dalam hex dan biner:
0x 01 04 C1 1D B7
1 0000 0100 1100 0001 0001 1101 1011 0111
Istilah tertinggi (x 32 ) biasanya tidak ditulis secara eksplisit, sehingga dapat direpresentasikan dalam hex seperti
0x 04 C1 1D B7
Jangan ragu untuk menghitung 1 dan 0, tetapi Anda akan menemukannya cocok dengan polinomial, di mana 1
bit 0 (atau bit pertama) danx
bit 1 (atau bit kedua).
Mengapa polinomial ini? Karena perlu ada polinomial standar yang diberikan dan standar itu ditetapkan oleh IEEE 802.3. Juga sangat sulit untuk menemukan polinomial yang mendeteksi kesalahan bit berbeda secara efektif.
Anda dapat menganggap CRC-32 sebagai rangkaian "Aritmatika Biner tanpa Pengangkutan", atau pada dasarnya "operasi XOR dan shift". Ini secara teknis disebut Aritmatika Polinomial.
Untuk lebih memahaminya, pikirkan perkalian ini:
(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
Jika kita mengasumsikan x adalah basis 2 maka kita mendapatkan:
x^7 + x^3 + x^2 + x^1 + x^0
Mengapa? Karena 3x ^ 3 adalah 11x ^ 11 (tapi kita hanya membutuhkan 1 atau 0 digit awal) jadi kita bawa:
=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
Tetapi ahli matematika mengubah aturan tersebut sehingga menjadi mod 2. Jadi pada dasarnya semua polinomial biner mod 2 hanyalah penjumlahan tanpa membawa atau XOR. Jadi persamaan asli kita terlihat seperti ini:
=( 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)
Saya tahu ini adalah lompatan keyakinan tetapi ini di luar kemampuan saya sebagai programmer garis. Jika Anda adalah siswa atau insinyur CS inti, saya menantang untuk memecahnya. Semua orang akan mendapat manfaat dari analisis ini.
Jadi untuk mengerjakan contoh lengkap:
Original message : 1101011011
Polynomial of (W)idth 4 : 10011
Message after appending W zeros : 11010110110000
Sekarang kita membagi Pesan yang ditambah dengan Poly menggunakan aritmatika CRC. Ini adalah divisi yang sama seperti sebelumnya:
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!!!!
Pembagian menghasilkan hasil bagi, yang kita buang, dan sisanya, yang merupakan checksum yang dihitung. Ini mengakhiri perhitungan. Biasanya, checksum kemudian ditambahkan ke pesan dan hasilnya dikirim. Dalam hal ini transmisi akan menjadi: 11010110111110.
Gunakan hanya angka 32-bit sebagai pembagi Anda dan gunakan seluruh aliran Anda sebagai dividen. Buang hasil bagi dan simpan sisanya. Tack sisanya di akhir pesan Anda dan Anda memiliki CRC32.
Ulasan pria rata-rata:
QUOTIENT
----------
DIVISOR ) DIVIDEND
= REMAINDER
- Ambil 32 bit pertama.
- Ganti bit
- Jika 32 bit kurang dari DIVISOR, lanjutkan ke langkah 2.
- XOR 32 bit oleh DIVISOR. Lanjutkan ke langkah 2.
(Perhatikan bahwa aliran harus dapat dibagi dengan 32 bit atau harus diisi. Misalnya, aliran ANSI 8-bit harus di-padded. Juga di akhir aliran, pembagian dihentikan.)
0xEDB88320
juga dapat ditulis msbit-first ( normal ) sebagai0x04C11DB7
. Apakah nilai tabel yang Anda temukan di tempat lain dibuat menggunakan polinomial CRC yang sama?