Я пишу функцию, которая сравнивает 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;
}
Проблема в том, как вы обрабатываете длину буфера данных. Когда вы получаете 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++];
}
Некоторые вопросы:
Ты используешь lLength
оба как ряд uint32_t
s во входном массиве и в виде количества байтов. Это не может быть и то и другое. Если это число uint32_t
Вам нужно умножить на 4, чтобы получить количество байтов.
Поскольку последний элемент массива содержит ожидаемый CRC, вы хотите избежать вычисления CRC этого элемента, поэтому вычтите 4 из числа байтов для обработки.
Ваш код зависит от порядкового номера машины, на которой он работает, из-за обработки uint32_t
массив как массив байтов.
Существуют различные варианты расчета CRC-32, поэтому вам необходимо убедиться, что вы используете правильный вариант.