首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在crc8-atm和crc8-maxim的计算方法上有什么不同吗?

在crc8-atm和crc8-maxim的计算方法上有什么不同吗?
EN

Stack Overflow用户
提问于 2022-08-25 10:39:34
回答 1查看 146关注 0票数 0

我想实现CRC8生成器。CRC8-自动取款机工作正常,没有问题。然而,当使用CRC8-MAXIM多项式时,计算结果却有所不同。我计算错了吗?

代码语言:javascript
运行
复制
==============================
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)
代码语言:javascript
运行
复制
==============================
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)

有关计算结果,请参阅下面的站点。

https://crccalc.com

如果有人熟悉CRC8的实现,请提供帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-25 14:19:59

是的,有。

常规CRC-8和CRC-8/MAXIM有不同的RefInRefOut配置:

  • RefIn参数指示数据字节在使用之前是否应该反转。
  • RefOut参数指示在应用最终的XorOut操作之前是否应该反转计算的CRC。

下面是一段代码计算CRC8算法:

代码语言:javascript
运行
复制
#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;
}

它的产出如下:

代码语言:javascript
运行
复制
--- 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

请注意,大多数情况下,RefInRefOut具有相同的值,并且可以进行代码优化(即避免所有字节反转操作)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73486080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档