我看到了多个C语言中crc8实现的例子,但是我无法弄清楚对于多项式(x8,x5,x4,1)即0x31
和初始化0xFF
。
同时反转输入=假,反转输出=假,最终XOR=0x00
。
我尝试了其中的几个,我期望这样CRC(0x00)=0xAC
和CRC(0xBEEF)=0x92
。
我看到了类似的实现,但没有真正起作用。我在这里看到了确切的功能http://www.sunshine2k.de/coding/javascript/crc/crc_js.html,在那里我可以提供初始化、反转输入、反转输出和最终XOR。但是有人能指给我一个C语言的实现吗?我知道最初我们需要把crc设为0xFF,但迄今为止我还没有找到可行的方法。
请查看我附加的示例代码:
#include <stdio.h>
#include <stdint.h>
uint8_t crc8(uint16_t input);
int main()
{
uint8_t temp1;
uint16_t temp2 = 0xBEEF;
printf("CRC input is 0x%X\n", temp2);
temp1 = crc8(temp2);
printf("CRC output is 0x%X\n", temp1);
return 0;
}
uint8_t crc8(uint16_t input)
{
uint8_t crc[8] = { };
uint8_t i;
uint8_t inv;
uint8_t output = 0;
for(i = 0; i < 16; i++)
{
inv = ((((input >> i) & 1) ^ crc[7]) & 1);
crc[7] = (crc[6] & 1);
crc[6] = (crc[5] & 1);
crc[5] = (crc[4] ^ inv & 1);
crc[4] = (crc[3] ^ inv & 1);
crc[3] = (crc[2] & 1);
crc[2] = (crc[1] & 1);
crc[1] = (crc[0] & 1);
crc[0] = (inv & 1);
}
for(i = 0; i < 8; i++){
output |= ((crc[i] << i) & (1 << i));
}
return output;
}
我看到了。
CRC input is 0xBEEF
CRC output is 0x2 //instead of 0x92
uint8_t
来表示状态。以下是一个与CRC计算相关的编程内容的链接:https://barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code - Antti Haapala -- Слава Україні