雾里闲逛 发表于 2025-4-27 00:08

分享一个CRC8的计算实现

CRC-8软件实现
以多项式G(X) = X^8+X^2+X^1+1来实现。
#define FACTOR (0x107 & 0xFF) //多项式因子(取低8bit)
unsigned char calcCRC(unsigned char *pdat, unsigned int len)
{
    unsigned char j;
    unsigned char crc = 0x00;
    while(len--)
        {
      crc ^= (*pdat++);//前一字节计算CRC后的结果异或上后一字节,再次计算CRC
      for (j=8; j>0; j--)
      {
                 crc <<= 1;
            if (crc & 0x80)//高位为1,需要异或;否则,不需要
            {
                crc ^= FACTOR;
            }
      }
    }

    return crc;
}


分形梦想家 发表于 2025-4-27 15:08

楼主,这个都用在哪些应用上面啊

jobszheng 发表于 2025-4-27 19:47

分形梦想家 发表于 2025-4-27 15:08
楼主,这个都用在哪些应用上面啊

传输数据或才校验数据小于128字节时,可以使用CRC8算法

分形梦想家 发表于 2025-4-27 20:44

明白了。
不过,为什么会出错啊

记忆花园 发表于 2025-4-28 18:36

这个CRC8的算法 很实用的。收下了,谢谢楼主分享

AdaMaYun 发表于 2025-4-29 16:12

CR8校验学习一下

OKAKAKO 发表于 2025-4-29 16:45

CRC8的算法 很实用的

银河漫步 发表于 2025-5-8 15:50

这个校验与校验和算法,哪个更靠谱一下啊

破晓战神 发表于 2025-5-23 18:57

这个实现很简洁,不过在实际应用中,CRC8的多项式选择和初始化值可能会有所不同,需要根据具体的协议来调整。

穷得响叮当侠 发表于 2025-5-24 09:29

这个实现看起来是基于C语言的,使用了一个简单的循环来计算CRC8值。代码简洁,易于理解。

雾里闲逛 发表于 2025-5-26 02:57

银河漫步 发表于 2025-5-8 15:50
这个校验与校验和算法,哪个更靠谱一下啊

针对不同的出错机制与数据量而定。
比如通讯故障CRC校验和校验和的差别不大,毕竟出错的概率都挺低的。
但对于错过错误,这时校验和的就有点力不从心了

又见春光 发表于 2025-7-23 22:16

参与一下讨论多项式 0x07,初始值 0xFF,适用于 Modbus、I2C 等校验。
uint8_t crc8(const uint8_t *data, uint8_t len) {
uint8_t crc = 0xFF; // 初始值
for (int i=0; i<len; i++) {
    crc ^= data;
    for (int j=0; j<8; j++)
      crc = (crc << 1) ^ ((crc & 0x80) ? 0x07 : 0);
}
return crc;
}


雾里闲逛 发表于 2025-7-29 07:05

又见春光 发表于 2025-7-23 22:16
参与一下讨论多项式 0x07,初始值 0xFF,适用于 Modbus、I2C 等校验。
uint8_t crc8(const uint8_t *data,...

Modbus-RTU使用的可是CRC16哟

绝影孤狼 发表于 2025-8-1 15:43

这个实现看起来是正确的,你使用了标准的CRC算法来计算CRC8。确保在使用前定义了正确的多项式因子。
页: [1]
查看完整版本: 分享一个CRC8的计算实现