我想实现CRC8生成器。CRC8-自动取款机工作正常,没有问题。然而,当使用CRC8-MAXIM多项式时,计算结果却有所不同。我计算错了吗?
==============================
CRC8-ATM
dat: "AB" = 01000001 01000010
ply: 0x107 = 100000111
res: 0x87
==============================
01000001 01000010 00000000
1000001 11
----------------------------
10000010 00000000
10000011 1
----------------------------
1 1000000
1 00000111
----------------------------
my_res: 10000111 => 0x87 (OK)
==============================
CRC8-MAXIM
dat: "AB" = 01000001 01000010
ply: 0x131 = 100110001
res: 0xA5
==============================
01000001 01000010 00000000
1001100 01
----------------------------
1101 00000010 00000000
1001 10001
----------------------------
100 10001010 00000000
100 110001
----------------------------
1001110 00000000
1001100 01
----------------------------
10 01000000
10 0110001
----------------------------
my_res : 00100010 => 0x22 (Must be 0xA5)
有关计算结果,请参阅下面的站点。
如果有人熟悉CRC8的实现,请提供帮助。
发布于 2022-08-25 14:19:59
是的,有。
常规CRC-8和CRC-8/MAXIM有不同的RefIn
和RefOut
配置:
RefIn
参数指示数据字节在使用之前是否应该反转。RefOut
参数指示在应用最终的XorOut
操作之前是否应该反转计算的CRC。下面是一段代码计算CRC8算法:
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
uint8_t uint8_reverse(uint8_t val)
{
uint8_t ret = 0;
for (size_t i = 0; i < 8; i++)
{
if (val & 0x80)
{
ret |= (1 << i);
}
val <<= 1;
}
return ret;
}
uint8_t crc8(uint8_t const * data, size_t data_size, uint8_t poly, uint8_t init,
bool refin, bool refout, uint8_t xor_out)
{
uint8_t crc = init;
for (size_t i = 0; i < data_size; i++)
{
crc = crc ^ (refin ? uint8_reverse(data[i]) : data[i]);
for (size_t j = 0; j < 8; j++)
{
if (crc & 0x80)
{
crc = (crc << 1) ^ poly;
}
else
{
crc <<= 1;
}
}
}
return (refout ? uint8_reverse(crc) : crc) ^ xor_out;
}
int main(void)
{
printf("--- Check data ---\n");
const uint8_t check[9] = "123456789";
printf("crc8: 0x%02x\n", crc8(check, 9, 0x07, 0x00, 0, 0, 0x00));
printf("crc8-cdma2000: 0x%02x\n", crc8(check, 9, 0x9b, 0xff, 0, 0, 0x00));
printf("crc8-darc: 0x%02x\n", crc8(check, 9, 0x39, 0x00, 1, 1, 0x00));
printf("crc8-itu: 0x%02x\n", crc8(check, 9, 0x07, 0x00, 0, 0, 0x55));
printf("crc8-maxim: 0x%02x\n", crc8(check, 9, 0x31, 0x00, 1, 1, 0x00));
printf("--- 'AB' data ---\n");
const uint8_t ab_data[2] = "AB";
printf("crc8: 0x%02x\n", crc8(ab_data, 2, 0x07, 0x00, 0, 0, 0x00));
printf("crc8-itu: 0x%02x\n", crc8(ab_data, 2, 0x07, 0x00, 0, 0, 0x55));
printf("crc8-maxim: 0x%02x\n", crc8(ab_data, 2, 0x31, 0x00, 1, 1, 0x00));
return 0;
}
它的产出如下:
--- Check data ---
crc8: 0xf4
crc8-cdma2000: 0xda
crc8-darc: 0x15
crc8-itu: 0xa1
crc8-maxim: 0xa1
--- 'AB' data ---
crc8: 0x87
crc8-itu: 0xd2
crc8-maxim: 0xa5
请注意,大多数情况下,RefIn
和RefOut
具有相同的值,并且可以进行代码优化(即避免所有字节反转操作)。
https://stackoverflow.com/questions/73486080
复制相似问题