uint32_t update_crc_32(const uint8_t* Crc_DataPtr, uint32_t Crc_Length, uint32_t Crc_StartValue32, bool Crc_IsFirstCall)函数实现
时间: 2023-07-26 20:08:36 浏览: 151
以下是一个简单的实现:
```c++
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]; // CRC 表
static bool is_table_init = false; // CRC 表是否已初始化
if (!is_table_init) { // 如果表未初始化,则先初始化表
uint32_t crc;
for (uint32_t i = 0; i < 256; i++) {
crc = i;
for (uint32_t j = 0; j < 8; j++) {
if (crc & 1)
crc = (crc >> 1) ^ 0xEDB88320;
else
crc >>= 1;
}
crc_table[i] = crc;
}
is_table_init = true;
}
uint32_t crc = Crc_StartValue32;
if (Crc_IsFirstCall) { // 如果是第一次调用,则将输入数据取反
for (uint32_t i = 0; i < Crc_Length; i++) {
crc ^= ~Crc_DataPtr[i];
for (uint32_t j = 0; j < 8; j++) {
if (crc & 1)
crc = (crc >> 1) ^ 0xEDB88320;
else
crc >>= 1;
}
}
return ~crc;
}
for (uint32_t i = 0; i < Crc_Length; i++) {
crc = (crc >> 8) ^ crc_table[(crc ^ Crc_DataPtr[i]) & 0xFF];
}
return crc;
}
```
该函数使用了一个静态的 CRC 表,如果是第一次调用函数,则会先初始化这个表。然后根据输入参数计算出 CRC 校验值并返回。其中,参数 `Crc_DataPtr` 是输入数据的指针,`Crc_Length` 是输入数据的长度,`Crc_StartValue32` 是 CRC 的起始值,`Crc_IsFirstCall` 表示是否是第一次调用该函数。如果是第一次调用,则该函数会将输入数据取反后计算 CRC 校验值。
阅读全文