我正在编写一个函数,将从前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 :(得分:0)
一些问题:
您在输入数组中使用lLength
作为多个uint32_t
s,并使用多个字节。它不可能两者兼而有之。如果它是uint32_t
的数量,则需要乘以4以获得字节数。
由于数组的最后一个元素包含预期的CRC,因此您希望避免计算该元素的CRC,因此从要处理的字节数中减去4。
由于将uint32_t
数组作为字节数组处理,您的代码依赖于它运行的机器的字节序。
CRC-32计算有不同的变化,因此您需要确保使用正确的。
答案 1 :(得分:0)
您如何处理数据缓冲区长度的问题。从plData[lLength-1]
检索缓冲区的CRC时,长度被解释为数组中元素的数量。稍后当您遍历缓冲区时,假定长度是缓冲区中的字节数。
如果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++];
}