CRC32 için polinom:
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
Veya onaltılık ve ikili olarak:
0x 01 04 C1 1D B7
1 0000 0100 1100 0001 0001 1101 1011 0111
En yüksek terim (x 32 ) genellikle açık bir şekilde yazılmaz, bu nedenle aynı şekilde onaltılık olarak gösterilebilir.
0x 04 C1 1D B7
1'leri ve 0ları saymaktan çekinmeyin, ancak bunların polinomla eşleştiğini göreceksiniz, burada 1
bit 0 (veya ilk bit) ve x
bit 1 (veya ikinci bit).
Neden bu polinom? Çünkü polinom için bir standart olması gerekiyor ve standart IEEE 802.3 tarafından belirlendi. Ayrıca, farklı bit hatalarını etkin bir şekilde algılayan bir polinom bulmak son derece zordur.
CRC-32'yi bir dizi "Taşımasız İkili Aritmetik" veya temelde "XOR ve kaydırma işlemleri" olarak düşünebilirsiniz. Bu teknik olarak Polinom Aritmetik olarak adlandırılır.
Daha iyi anlamak için şu çarpımı düşünün:
(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'in 2 tabanı olduğunu varsayarsak, şunu elde ederiz:
x^7 + x^3 + x^2 + x^1 + x^0
Neden? 3x ^ 3, 11x ^ 11 olduğundan (ancak yalnızca 1 veya 0 ön basamağa ihtiyacımız var), bu nedenle şunları aktarıyoruz:
=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
Ancak matematikçiler kuralları mod 2 olacak şekilde değiştirdiler. Yani temelde herhangi bir ikili polinom mod 2, taşıma veya XOR içermeyen bir toplamadır. Yani orijinal denklemimiz şöyle görünür:
=( 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)
Bunun bir inanç sıçraması olduğunu biliyorum ama bu benim satır programcısı olarak yeteneğimin ötesinde. Sert çekirdekli bir bilgisayar bilimleri öğrencisi veya mühendisi iseniz, bunu yıkmaya meydan okuyorum. Bu analizden herkes yararlanacak.
Öyleyse tam bir örnek oluşturmak için:
Original message : 1101011011
Polynomial of (W)idth 4 : 10011
Message after appending W zeros : 11010110110000
Şimdi, CRC aritmetiği kullanarak artırılmış Mesajı Poly'ye böleriz. Bu, öncekiyle aynı bölüm:
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!!!!
Bölme, attığımız bir bölüm ve hesaplanan sağlama toplamı olan bir kalan verir. Bu hesaplamayı bitirir. Genellikle, sağlama toplamı daha sonra mesaja eklenir ve sonuç iletilir. Bu durumda iletim şöyle olacaktır: 11010110111110.
Bölen olarak yalnızca 32 bitlik bir sayı kullanın ve yayınınızın tamamını temettü olarak kullanın. Bölümü atın ve kalanı saklayın. Mesajınızın sonunda kalan kısmı işaretleyin ve bir CRC32'ye sahip olun.
Ortalama erkek incelemesi:
QUOTIENT
----------
DIVISOR ) DIVIDEND
= REMAINDER
- İlk 32 biti alın.
- Kaydırma bitleri
- 32 bit DIVISOR'dan azsa, 2. adıma gidin.
- DIVISOR tarafından XOR 32 bit. 2. adıma gidin.
(Akışın 32 bit'e bölünmesi veya doldurulması gerektiğini unutmayın. Örneğin, 8 bitlik bir ANSI akışının doldurulması gerekir. Ayrıca akışın sonunda bölme durdurulur.)
0xEDB88320
ayrıca msbit-first ( normal ) olarak yazılabilir0x04C11DB7
. Başka bir yerde bulduğunuz tablo değerleri aynı CRC polinomu kullanılarak mı oluşturuldu?