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 (또는 두 번째 비트)입니다.
왜이 다항식입니까? 주어진 다항식 표준이 필요하고 표준은 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-first ( normal )로 쓸 수도 있습니다0x04C11DB7
. 다른 곳에서 찾은 테이블 값이 동일한 CRC 다항식을 사용하여 생성 되었습니까?