蓝牙低功耗(BLE)使用24位CRC,生成多项式为
x ^ 24 + x ^ 10 + x ^ 9 + x ^ 6 + x ^ 4 + x ^ 3 + x + 1
我遇到了this article,它在C中实现了这个CRC,使用"初始值0x555555"。我按如下方式粘贴代码:
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,并且位操作看起来很神奇。谁能解释他在做什么?谢谢!
答案 0 :(得分:2)
也许uint8_t
是唯一可用的整数类型,这可以解释为什么作者一次移位和异或24位,dst[0..2]
8位。
该代码实现了一个基本的CRC移位寄存器,其中数据一次移位一位,当数据位与数据位异或时,CRC与多项式异或。移出寄存器的位是1。注意,由于多项式在x 24 以下的最高功率为x 10
使用0x555555
而不是0xffffff
进行初始化只是一种品味问题。使用除零以外的任何值进行初始化是一个好主意,因为数据中的初始字符串零不会保持CRC不变。
答案 1 :(得分:0)
在低功耗蓝牙中,CRC移位寄存器初始化为0x555555,用于广告和连接设备的随机值(在连接过程中共享)。