uint8_t crc5_itu(uint8_t *data, uint16_t length) { uint8_t i; uint8_t crc = 0; // Initial value while(length--) { crc ^= *data++; // crc ^= *data; data++; for (i = 0; i < 8; ++i) { if (crc & 1) crc = (crc >> 1) ^ 0x15;// 0x15 = (reverse 0x15)>>(8-5) else crc = (crc >> 1); } } return crc; }转为python
时间: 2024-02-14 13:24:10 浏览: 63
def crc5_itu(data, length):
crc = 0
i = 0
while length > 0:
length -= 1
crc ^= data[i]
i += 1
for j in range(8):
if crc & 1:
crc = (crc >> 1) ^ 0x15
else:
crc = (crc >> 1)
return crc
相关问题
uint32_t update_crc_32(const uint8_t* Crc_DataPtr, uint32_t Crc_Length, uint32_t Crc_StartValue32, bool Crc_IsFirstCall)函数实现
以下是一个简单的实现:
```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 校验值。
uint16_t crc16_maxim(uint8_t *data, uint16_t length) { uint8_t i; uint16_t crc = 0; while(length--) { crc ^= *data++; for (i = 0; i < 8; ++i) { if (crc & 1) crc = (crc >> 1) ^ 0xA001; else crc = (crc >> 1); } } return ~crc; } int main() { uint8_t data; uint8_t crc; data = 0x34; crc = crc16_maxim(&data, 1); printf("data:%02x, crc:%02x\n", data, crc); return 0; }
这段代码实现了基于多项式 0x8005 的 CRC16 校验算法,使用了最大值生成多项式算法(Maxim-Dallas-DS28CRC算法)。具体实现过程如下:
1. 定义一个 16 位的 CRC 校验码(crc),初始值为 0。
2. 遍历待校验数据(data)中的每个字节,对每个字节执行以下操作:
1. 将 crc 与当前字节进行异或操作。
2. 对当前字节的每一位进行判断,如果为 1,则将 crc 右移一位并与 0xA001 进行异或操作,否则只将 crc 右移一位。
3. 返回 crc 的取反值作为最终的 CRC 校验码。
4. 在 main 函数中定义一个字节数据 data,将其赋值为 0x34,并调用 crc16_maxim 函数计算出校验码 crc。
5. 使用 printf 函数输出 data 和 crc 的值。
需要注意的是,该代码只针对单个字节数据进行校验,如果需要对多字节数据进行校验,需要在函数中增加对数据长度的判断和遍历。
阅读全文