了解实现蓝牙低功耗CRC的C代码

时间:2014-08-19 20:51:43

标签: c bluetooth-lowenergy crc

蓝牙低功耗(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,并且位操作看起来很神奇。谁能解释他在做什么?谢谢!

2 个答案:

答案 0 :(得分:2)

也许uint8_t是唯一可用的整数类型,这可以解释为什么作者一次移位和异或24位,dst[0..2] 8位。

该代码实现了一个基本的CRC移位寄存器,其中数据一次移位一位,当数据位与数据位异或时,CRC与多项式异或。移出寄存器的位是1。注意,由于多项式在x 24 以下的最高功率为x 10

使用0x555555而不是0xffffff进行初始化只是一种品味问题。使用除零以外的任何值进行初始化是一个好主意,因为数据中的初始字符串零不会保持CRC不变。

答案 1 :(得分:0)

在低功耗蓝牙中,CRC移位寄存器初始化为0x555555,用于广告和连接设备的随机值(在连接过程中共享)。