gpt4 book ai didi

c - 支持验证C CRC8实现

转载 作者:太空宇宙 更新时间:2023-11-04 04:21:50 24 4
gpt4 key购买 nike

在我写的一个crc计算器上做了一些测试,该计算器基于1-Wire中应用的dallas crc8,它使用0x8c poly。我正在测试它在 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;
};

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

有没有人可以帮助我了解这里发生的事情?

最佳答案

我认为您的测试方法存在缺陷。根据我的测试,原始实现检测到所有 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 与注入(inject)位错误后的 crc 相同,那就不好了(crc 生成器没有检测到错误)。

关于c - 支持验证C CRC8实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46136403/

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