低功耗蓝牙 (BLE) 使用 24 位 CRC,生成多项式为
x^24 + x^10 + x^9 + x^6 + x^4 + x^3 + x + 1
我遇到了this article它使用“0x555555 的初始值”在 C 中实现了此 CRC。我粘贴代码如下:
void btLeCrc(const uint8_t* data, uint8_t len, uint8_t* dst){
uint8_t v, t, d;
while(len--){
d = *data++;
for(v = 0; v < 8; v++, d >>= 1){
t = dst[0] >> 7;
dst[0] <<= 1;
if(dst[1] & 0x80) dst[0] |= 1;
dst[1] <<= 1;
if(dst[2] & 0x80) dst[1] |= 1;
dst[2] <<= 1;
if(t != (d & 1)){
dst[2] ^= 0x5B;
dst[1] ^= 0x06;
}
}
}
}
但是,我很难理解这段代码。好像和我以前看到的CRC码有点不一样。例如,他使用初始值 0x555555 而不是 0x000000 或 0xffffff,并且位操作对我来说看起来很神奇。谁能解释一下他在做什么?谢谢!
最佳答案
也许uint8_t
是唯一可用的整数类型,这可以解释为什么作者要对24位值dst[0..2]进行移位和异或运算
> 一次 8 位。
该代码实现了一个基本的 CRC 移位寄存器,其中数据一次移入一位,当数据位与移出的位进行异或时,CRC 与多项式进行异或。寄存器就是其中之一。请注意,多项式的异或仅在三个寄存器字节中的两个上进行,因为多项式低于 x24 的最高幂是 x10。
使用0x555555
而不是0xffffff
进行初始化只是一个品味问题。使用零以外的任何值进行初始化是一个好主意,因为数据中的初始零字符串不会使 CRC 保持不变。
关于c - 了解实现低功耗蓝牙 CRC 的 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25392753/