พหุนามสำหรับ 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
ถ้าเราถือว่า 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 ดังนั้นโดยพื้นฐานแล้ว binary polynomial 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 บิตหรือควรมีการบุนวมตัวอย่างเช่นสตรีม ANSI 8 บิตจะต้องมีการบุนวมนอกจากนี้ในตอนท้ายของสตรีมการแบ่งจะหยุดลงด้วย)
0xEDB88320
ยังสามารถเขียน msbit แรก ( ปกติ )0x04C11DB7
ในฐานะ ค่าตารางที่คุณพบจากที่อื่นสร้างขึ้นโดยใช้พหุนาม CRC เดียวกันหรือไม่