2017-04-11 9 views
0

32 비트 부호없는 정수를 사용하여 CRC16을 계산하는 코드를 작성하고 있습니다. CRC 연산을 수행하는 XOR 함수에서 반환 값을 출력하려고 할 때 항상 0을 인쇄합니다. 그러나 print 문과 같은 다양한 디버그 메서드를 시도했지만, 알아낼 수 없습니다!CRC 검사 XOR 함수 반환 값은 항상 0입니다.

여기 내 XOR 기능입니다 :

uint32_t XOR(uint32_t divisor, uint32_t dividend) 

{ 
    uint32_t divRemainder = dividend; 
    uint32_t currentBit; 

    for(currentBit = 32; currentBit > 0; --currentBit) 
    { 
    if(dividend && 0x32) 
    { 
     divRemainder = divRemainder^divisor; 
    } 
    divRemainder = divRemainder << 1; 
    } 
    return (divRemainder >> 8); 
} 

위의 메소드를 호출 기능 :

void crcCalculation(char *text, FILE *input, char *POLYNOMIAL) 
    { 
     int i = strlen(text); 
     uint32_t dividend = atoi(POLYNOMIAL); 
     uint32_t result; 


     readInput(text, input); 
     printText(text); 


     printf("CRC 16 calculation progress:\n"); 


     if(i < 504) 
     { 
     for(; i!=504; i++) 
     { 
      text[i] = '.'; 
     } 
     } 

    result = XOR((uintptr_t)POLYNOMIAL, dividend); 

     printf(" - %d", result); 

} 

상수 다항식 (내가 제대로 CRC (16)이 계산 희망 :

#define POLYNOMIAL A053 

올바른 방향으로 조금 움직여 주시면 감사하겠습니다.

+3

논리 AND와 비트 AND의 차이점을 알고 있습니까? – user694733

+0

@ user694733 나는 그렇지 않다. 나는 그들이 똑같다고 생각했다. 내가 그걸 읽을거야. – starlight

+2

'POLYNOMIAL'이 가리키는 데이터가 아니라 포인터 자체의 체크섬을 만들지 않습니다. 그건별로 유용하지 않아 보입니다. 'text' 문자열 (0으로 끝나지 않을 수도 있음)에 대한 체크섬도 계산하지 않습니다. 정말로 매크로를 정의합니까? 표시하는 코드와 함께 사용하면 많은 의미가 없습니다. –

답변

3

코드 if(dividend && 0x32)은 전혀 이해가되지 않으며 1으로 평가됩니다. 이것이 아무런 효과가없는 이유입니다.

아마도 if(dividend & 32) 또는 이와 비슷한 의미입니까? 논리적 AND 대신 비트 단위 AND와 같습니다. 그리고 16 진수 0x32 십진수 50 대신 16 진수 0x20 십진수 32 (아마도 말이 안 되겠습니까?)이 아닐 수도 있습니다 (전혀 이해가되지 않습니다).

이 CRC 알고리즘은 전반적으로 매우 비현실적입니다. 예를 들어 31 비트 이상만 반복합니다.

+0

@Lundin 제안에 따라 코드를 업데이트했지만 여전히 0을 출력합니다. 잘못 업데이트 했습니까? – starlight

+0

@starlight 구현을 실제로 이해하지 못하고 있습니다. 32 비트 정수가해야하는 것을 따르지 않습니다. 16 비트 다항식을 사용하고 있지 않습니까? 또한 일반적으로 답변을 게시 할 때 완전히 다른 것을 묻도록 질문을 편집하지 마십시오. 추가 질문이 필요하면 새로운 질문을 올리십시오. – Lundin