uint32_t update_crc_32(const uint8_t* Crc_DataPtr, uint32_t Crc_Length, uint32_t Crc_StartValue32, bool Crc_IsFirstCall) 函数实现,计算124Ks数据举例
时间: 2023-08-05 10:13:41 浏览: 106
code uint8-t *p-flash 与uint8-t code *p-flash的区别
好的,这里给出一个基于标准CRC-32算法的实现:
```
#define CRC32_POLYNOMIAL 0xEDB88320
uint32_t update_crc_32(const uint8_t* Crc_DataPtr, uint32_t Crc_Length, uint32_t Crc_StartValue32, bool Crc_IsFirstCall)
{
static uint32_t Crc_Table[256];
static bool Crc_Table_Initialized = false;
uint32_t Crc_Reg = Crc_StartValue32;
uint32_t Crc_Table_Index, Crc_Data_Index;
uint8_t Crc_Data;
if (!Crc_Table_Initialized || Crc_IsFirstCall)
{
// 初始化CRC表
for (Crc_Table_Index = 0; Crc_Table_Index < 256; ++Crc_Table_Index)
{
uint32_t Crc_Table_Entry = Crc_Table_Index;
for (int Bit_Index = 0; Bit_Index < 8; ++Bit_Index)
{
if (Crc_Table_Entry & 1)
{
Crc_Table_Entry = (Crc_Table_Entry >> 1) ^ CRC32_POLYNOMIAL;
}
else
{
Crc_Table_Entry >>= 1;
}
}
Crc_Table[Crc_Table_Index] = Crc_Table_Entry;
}
Crc_Table_Initialized = true;
}
for (Crc_Data_Index = 0; Crc_Data_Index < Crc_Length; ++Crc_Data_Index)
{
Crc_Data = Crc_DataPtr[Crc_Data_Index];
Crc_Reg = Crc_Table[(Crc_Reg ^ Crc_Data) & 0xFF] ^ (Crc_Reg >> 8);
}
return Crc_Reg;
}
int main()
{
uint8_t data[124 * 1024]; // 124K数据
uint32_t crc = update_crc_32(data, sizeof(data), 0xFFFFFFFF, true);
printf("CRC-32: %08X\n", crc ^ 0xFFFFFFFF);
return 0;
}
```
这里使用了一个静态变量 `Crc_Table` 来存储CRC表,以减少重复计算。另外,参数 `Crc_IsFirstCall` 被用来指示是否是第一次调用该函数,如果是则需要初始化CRC表。最后,输出的CRC值需要和 `0xFFFFFFFF` 取异或才是最终的CRC值。
阅读全文