Đa thức cho CRC32 là:
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
Hoặc ở dạng hex và binary:
0x 01 04 C1 1D B7
1 0000 0100 1100 0001 0001 1101 1011 0111
Số hạng cao nhất (x 32 ) thường không được viết rõ ràng, vì vậy thay vào đó, nó có thể được biểu diễn bằng hex giống như
0x 04 C1 1D B7
Hãy thoải mái đếm số 1 và số 0, nhưng bạn sẽ thấy chúng khớp với đa thức, ở đó 1
là bit 0 (hoặc bit đầu tiên) và x
là bit 1 (hoặc bit thứ hai).
Tại sao lại là đa thức? Bởi vì cần phải có một đa thức đã cho tiêu chuẩn và tiêu chuẩn được thiết lập bởi IEEE 802.3. Ngoài ra, rất khó để tìm một đa thức phát hiện các lỗi bit khác nhau một cách hiệu quả.
Bạn có thể nghĩ về CRC-32 như một loạt "Số học nhị phân không có đường", hoặc về cơ bản là "XOR và các phép toán thay đổi". Về mặt kỹ thuật, đây được gọi là Số học đa thức.
Để hiểu rõ hơn, hãy nghĩ đến phép nhân này:
(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
Nếu giả sử x là cơ số 2 thì chúng ta nhận được:
x^7 + x^3 + x^2 + x^1 + x^0
Tại sao? Vì 3x ^ 3 là 11x ^ 11 (nhưng chúng ta chỉ cần 1 hoặc 0 chữ số trước) nên chúng ta chuyển sang:
=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
Nhưng các nhà toán học đã thay đổi các quy tắc để nó là mod 2. Vì vậy, về cơ bản bất kỳ đa thức nhị phân nào mod 2 chỉ là phép cộng không có carry hoặc XOR. Vì vậy, phương trình ban đầu của chúng tôi trông giống như:
=( 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)
Tôi biết đây là một bước nhảy vọt của niềm tin nhưng điều này nằm ngoài khả năng của tôi với tư cách là một lập trình viên dòng. Nếu bạn là một kỹ sư hoặc sinh viên CS cứng rắn, tôi thách thức bạn phải phá vỡ điều này. Mọi người sẽ được hưởng lợi từ phân tích này.
Vì vậy, để tìm ra một ví dụ đầy đủ:
Original message : 1101011011
Polynomial of (W)idth 4 : 10011
Message after appending W zeros : 11010110110000
Bây giờ chúng ta chia Thông điệp tăng cường cho Poly bằng số học CRC. Đây là sự phân chia giống như trước đây:
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!!!!
Phép chia mang lại một thương số mà chúng ta loại bỏ và phần còn lại, là tổng kiểm tra được tính toán. Điều này kết thúc phép tính. Thông thường, tổng kiểm tra sau đó được thêm vào thông báo và kết quả được truyền đi. Trong trường hợp này, đường truyền sẽ là: 11010110111110.
Chỉ sử dụng số 32 bit làm ước số của bạn và sử dụng toàn bộ luồng làm cổ tức của bạn. Bỏ thương và giữ phần còn lại. Đánh dấu phần còn lại vào cuối tin nhắn của bạn và bạn có CRC32.
Nhận xét chàng trai trung bình:
QUOTIENT
----------
DIVISOR ) DIVIDEND
= REMAINDER
- Lấy 32 bit đầu tiên.
- Shift bit
- Nếu 32 bit nhỏ hơn DIVISOR, hãy chuyển sang bước 2.
- XOR 32 bit bởi DIVISOR. Chuyển sang bước 2.
(Lưu ý rằng luồng phải được chia cho 32 bit hoặc nó phải được đệm. Ví dụ: luồng ANSI 8 bit sẽ phải được đệm. Cũng ở cuối luồng, việc phân chia bị tạm dừng.)
0xEDB88320
bạn cũng có thể được viết msbit-first ( normal ) như0x04C11DB7
. Các giá trị bảng bạn tìm thấy ở nơi khác có được tạo bằng cách sử dụng cùng một đa thức CRC không?