2013-07-31 2 views
0

Im записывает функцию, которая сравнивает 32-битный CRC, который извлекается из буфера (uint32_t lBuffer[10]), который первые десять записей содержат случайно сгенерированные данные, в вычисленный CRC, который вычисляется в функции CheckCRC. Может ли кто-нибудь понять, почему он не хочет давать истинный результат? Любая помощь приветствуется!Проверить функцию Сравнить выпуск

Вот код функции:

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

Проблема в том, как вы можете обрабатывать длину буфера данных. Когда вы извлекаете CRC буфера из plData[lLength-1], длина интерпретируется как количество элементов в массиве. Позже, когда вы перебираете буфер, длина считается количеством байтов в буфере.

Если lLength представляет собой количество байтов, которое необходимо будет компенсировать при извлечении существующего значения CRC из буфера. Вам также нужно будет отрегулировать размер буфера, чтобы сам CRC не включался при переходе по буфере.

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

Если lLength представляет число элементов в массиве, а не число байтов, которые необходимо будет регулировать размер. Снова вам нужно принять во внимание, что существующий 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. Вы используете lLength как в ряде uint32_t с во входном массиве, а также ряд байтов. Это не может быть и то, и другое. Если это число uint32_t, вам нужно умножить на 4, чтобы получить количество байтов.

  2. Поскольку последний элемент массива содержит ожидаемый CRC, вы хотите избежать вычисления CRC этого элемента, поэтому вычитайте 4 из числа байтов в процесс.

  3. Ваш код зависит от конечности машины, на которой он выполняется, из-за обработки массива uint32_t в виде массива байтов.

  4. Существуют различные варианты расчета CRC-32, поэтому вам нужно убедиться, что вы используете правильный.

Смежные вопросы