2013-07-31 4 views
0

처음 10 개의 항목이 임의로 생성 된 버퍼 (uint32_t lBuffer[10])에서 추출한 32 비트 CRC와 CheckCRC 함수 내에서 계산 된 계산 된 CRC를 비교하는 함수를 작성합니다. 왜 진정한 결과를주고 싶지 않은지 누가 알 수 있습니까? 어떤 도움을 많이 주시면 감사하겠습니다!확인 함수 비교 문제

bool CRC32::CheckCRC(const uint32_t* plData , uint32_t lLength, uint32_t previousCrc32) 
{ 
    bool FlagPass; 
    uint32_t lCalcCRC,lMsgCRC; 


    //Msg CRC needs to be extracted first 
    lMsgCRC = plData[lLength-1]; 

    //Newly calculated CRC 
    //lCalcCRC = calculate_CRC32(plData,lLength-1,lInitCRC); 

    lCalcCRC = ~previousCrc32; 
    unsigned char* current = (unsigned char*) plData; 

    while (lLength--) 
    { 
     lCalcCRC = (lCalcCRC >> 8)^crc_table[(lCalcCRC & 0xFF)^*current++]; 
    } 
    lCalcCRC = ~lCalcCRC; 


    if (lCalcCRC == lMsgCRC) 
    { 
     FlagPass = true; 
    } 
    else 
    { 
     FlagPass = false; 
    } 
    return FlagPass; 
} 
+0

'return lCalcCRC == lMsgCRC; – Roddy

답변

0

는 데이터 버퍼의 길이를 처리 토끼 방법의 문제. plData[lLength-1]에서 버퍼의 CRC를 검색하면 길이는 배열의 요소 수로 해석됩니다. 나중에 버퍼를 반복 할 때 길이는 버퍼의 바이트 수로 간주됩니다.

lLength은 버퍼에서 기존 CRC 값을 검색 할 때이를 보완해야하는 바이트 수를 나타냅니다. 또한 버퍼를 반복 할 때 기존 CRC 자체가 포함되지 않도록 버퍼 크기를 조정해야합니다. lLength 만약

uint32_t lMsgCRC = *((const uint32_t*)((const char*)plData + lLength) - 1); 
lLength -= sizeof(plData[0]); 

배열보다는 당신이 크기를 조정해야합니다 바이트 수있는 요소의 수를 나타냅니다. 다시 기존 CRC가 버퍼의 끝에 있다는 것을 고려해야합니다.

// Adjust length by size of elements 
lLength = (lLength - sizeof(plData[0])) * sizeof(plData[0]); 
while (lLength--) 
{ 
    lCalcCRC = (lCalcCRC >> 8)^crc_table[(lCalcCRC & 0xFF)^*current++]; 
} 
0

일부 문제 : 다음

함수 코드

  1. 당신은 입력 배열의 uint32_t s의 숫자로 lLength을 모두 사용하고 바이트 수있다. 둘 다있을 수는 없습니다. uint32_t의 숫자 인 경우 바이트 수를 얻기 위해 4를 곱해야합니다.

  2. 배열의 마지막 요소에 예상 CRC가 포함되어 있으므로 해당 요소의 CRC 계산을 피하기 위해 처리 할 바이트 수에서 4를 뺍니다.

  3. 코드는 uint32_t 배열을 바이트 배열로 처리하기 때문에 실행되는 컴퓨터의 엔디 언 상태에 따라 다릅니다.

  4. CRC-32 계산에는 여러 가지 변형이 있으므로 정확한 CRC-32 계산을 사용해야합니다.