【问题标题】:Support verifiyng C CRC8 implementation支持验证 C CRC8 实现
【发布时间】:2017-09-10 01:00:49
【问题描述】:

已经对我编写的基于 dallas crc8 编写的 crc 计算器进行了一些测试,它应用在 1-Wire 中,它使用 0x8c 多边形。我正在测试它在 15 字节字符串上添加 1、2 和 3 位错误(也将位错误添加到 crc 本身)。粘贴的实现无法识别 2、2 位错误和 9、3 位错误...

static inline uint8_t roll(char input_byte, uint8_t crc) {
  for(uint8_t i = 8; i; i--, input_byte >>= 1) {
    uint8_t result = (crc ^ input_byte) & 0x01;
    crc >>= 1;
    if(result) crc ^= 0x8C;
  }
 return crc;
};


static inline uint8_t compute(const uint8_t *input_byte, uint16_t length) {
  uint8_t crc = 0;
  for(uint16_t b = 0; b < length; b++)
    crc = roll(input_byte[b], crc);
  return crc;
};

摆弄代码我注意到删除 & 0x01 会大大提高准确性,无论值数据有什么(尝试使用不同类型的字符串):

    static inline uint8_t roll(char input_byte, uint8_t crc) {
  for(uint8_t i = 8; i; i--, input_byte >>= 1) {
    uint8_t result = crc ^ input_byte;
    crc >>= 1;
    if(result) crc ^= 0x8C;
  }
 return crc;
};


static inline uint8_t compute(const uint8_t *input_byte, uint16_t length) {
  uint8_t crc = 0;
  for(uint16_t b = 0; b < length; b++)
    crc = roll(input_byte[b], crc);
  return crc;
};

通过发布的修改,对于我需要的 0-15 个字符或 0-120 位的范围,我始终没有 1、2 或 3 位错误,并且始终保持 100% 的准确度

有人可以帮助我了解这里发生了什么吗?

【问题讨论】:

  • 请注意 charuint8_t 是不同的类型。一个是char,另一个是unsigned char。该算法需要 unsigned 字符以实现可移植性 -> uint8_t input_byte-
  • 另外,您是否测试了 all 1 位错误?
  • 感谢 Antii 的类型建议,我将修复 :) 在这一点上,我认为我的测试已损坏。

标签: c crc


【解决方案1】:

我认为您的测试方法存在缺陷。根据我的测试,原始实现检测到所有 1、2 和 3 位错误,以及 99.2% 的 4 位错误。您提出的替代方案几乎总是产生完全相同的结果 (0xf7)。这是意料之中的,因为crc ^ input_byte 几乎总是非零。

因此,您的实现(大部分时间)等同于:

static inline uint8_t compute(const uint8_t *input_byte, uint16_t length) {
    uint8_t crc = 0;
    for (int i = 0; i < 15; i++) {
        for (int j = 0; j < 8; j++) {
            crc >>= 1;
            crc ^= 0x8C;
        }
    }
    return crc;
}

确实会生成值0xf7

我认为您的测试中的缺陷在于它假定 crc 匹配是一件好事。相反,如果原始字符串上的crc与注入位错后的crc相同,那就不好了(crc生成器没有检测到错误)。

【讨论】:

  • 我可以请您在这里发布您执行的测试吗?
猜你喜欢
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 2011-09-11
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多