문제

이진 문자열 (아래의 16 진수)이고 CRC-16-CCITT를 사용하고 있습니다.나는 모든 CRC가 0x1D0F로 설정된 값으로 나올 것을 원합니다.CRC가 원래 메시지의 끝까지 2 바이트 끝에 추가 하여이 값을이 값과 일치시킬 수있는 것이 가능합니다.

전.

0x01 0000 0000 0000 0000 0000 0000 0000 0000 0000

첨부 된 값은 0x13D8 입니다.

이 13D8을 메시지에 추가하여 CRC가 원하는 0x1D0F를 제공합니다.

이 0x13D8 값을 계산하는 방법에 대한 도움말은 크게 감사 할 수 있습니다.

코드가 보너스가 될 수있는 코드에서 깔끔하게 수행 할 수 있습니다!

도움이 되었습니까?

해결책

이론은 매우 간단하지만, 물론 올바르게 구현하기 위해 조심스럽게 조심스럽게 생각합니다.

메시지의 어느 곳에서나 16 비트를 선택할 수 있습니다 (마지막에 두 바이트 또는 원하는 곳에서 흩어져있는 16 개 개별 비트 포함). I= 0..15 에 대해 XI 을 호출하십시오. 그런 다음 비트 바이 비트 CRC 알고리즘을 사용하여 메시지를 처리하지만 CRC의 16 비트를 나타내는 XI 에서 16 선형 방정식의 계수를 생성하고 업데이트합니다.

당신은 간단한 매트릭스 방정식 ax + b= c 을 가지고 있습니다. ax + b= c 에 대한 동작은 일반적인 곱셈 및 첨가가 아니라 오히려 단일 비트 exclusive-or 작업이다. < / P>

이제는 일반적인 방법을 사용하여 xor 에서 실제로 쉬운 매트릭스 을 반전시킵니다 (추가 및 빼기 똑같은 것, 단지 독점적으로 또는), b ^ c 을 계산하고 그것을 반전으로 곱합니다. 이제 원하는 CRC를 가져 오기 위해 XI 비트에 넣을 값이 있습니다.

추가 단순화는 실제 메시지가 필요하지 않으며 xi 의 길이와 위치 만 있지 않고 메시지의 다른 모든 비트로 0으로 설정된 모든 비트를 모두 수행하는 것입니다. ...에 이는 동일한 길이의 p q 의 두 개의 메시지를 가면 CRC (P) ^ CRC (q)= CRC (p ^ q) . (이것은 CRC의 사전 및 사후 처리를 무시하고 핵심 CRC 알고리즘에 적용됩니다.)

업데이트 :

spoof.c 가 특정 CRC를 생성하는 메시지 수정 문제를 해결할 수 있습니다. .

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top