gpt4 book ai didi

c - C语言中如何计算crc8?

转载 作者:行者123 更新时间:2023-11-30 18:23:39 25 4
gpt4 key购买 nike

我已经在 C 中看到了 crc8 实现的多个实现,但我无法弄清楚多项式(x8,x5,x4,1),即 0x31 和初始化 0xFF

还反射(reflect)输入 = False,反射(reflect)输出 = False 和最终 XOR = 0x00

我尝试了其中的几个,我希望 CRC(0x00)=0xACCRC(0xBEEF)=0x92

我见过类似的实现,但没有真正解决问题。我在这里看到了确切的功能http://www.sunshine2k.de/coding/javascript/crc/crc_js.html我可以在其中进行初始化、反射(reflect)输入、反射(reflect)输出和最终的异或。但是有人可以指出我在 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

最佳答案

假设您在 PC 或其他小端处理器上运行,temp2 在内存中存储为 {0xEF, 0xBE}。未优化的示例代码(不使用表格)。对于更快的版本,使用 j 的内部循环可以替换为 256 字节表查找:crc = table[crc ^ data[i]];

#include <stdio.h>

typedef unsigned char uint8_t;

uint8_t gencrc(uint8_t *data, size_t len)
{
uint8_t crc = 0xff;
size_t i, j;
for (i = 0; i < len; i++) {
crc ^= data[i];
for (j = 0; j < 8; j++) {
if ((crc & 0x80) != 0)
crc = (uint8_t)((crc << 1) ^ 0x31);
else
crc <<= 1;
}
}
return crc;
}

int main()
{
uint8_t data[8] = {0xBE,0xEF,0,0,0,0,0,0};
uint8_t crc;
crc = gencrc(data, 2); /* returns 0x92 */
printf("%1x\n", crc);
crc = gencrc(data+2, 1); /* returns 0xac */
printf("%1x\n", crc);
return 0;
}

关于c - C语言中如何计算crc8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51752284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com