【发布时间】: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% 的准确度
有人可以帮助我了解这里发生了什么吗?
【问题讨论】:
-
请注意
char和uint8_t是不同的类型。一个是char,另一个是unsignedchar。该算法需要 unsigned 字符以实现可移植性 ->uint8_t input_byte- -
另外,您是否测试了 all 1 位错误?
-
感谢 Antii 的类型建议,我将修复 :) 在这一点上,我认为我的测试已损坏。