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
または、16進数と2進数で:
0x 01 04 C1 1D B7
1 0000 0100 1100 0001 0001 1101 1011 0111
最高項(x 32)は通常明示的に記述されないため、次のように16進数で表すことができます。
0x 04 C1 1D B7
1と0を自由にカウントしてください。ただし1
、ビット0(または最初のビット)とx
ビット1(または2番目のビット)が多項式と一致していることがわかります。
なぜこの多項式なのか?与えられた多項式には標準が必要であり、その標準は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に変更しました。基本的に、バイナリ多項式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演算を使用して、拡張されたメッセージをPolyで除算します。これは以前と同じ部門です:
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に進みます。
- DIVISORによるXOR 32ビット。手順2に進みます。
(ストリームは32ビットで分割可能でなければならないか、パディングする必要があることに注意してください。たとえば、8ビットのANSIストリームはパディングする必要があります。また、ストリームの最後で、分割は停止されます。)
0xEDB88320
またMSBitから、最初に(書き込むことができ、通常のように)0x04C11DB7
。他の場所で見つけたテーブル値は、同じCRC多項式を使用して生成されましたか?