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

标签 c bluetooth-lowenergy crc

低功耗蓝牙 (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/

相关文章:

c - 在 Windows 上诊断 C 应用程序崩溃的工具/技术

c - 简单 C - 提取变量的即时值并存储它

android - Android 6.0 上的低功耗蓝牙 startScan 找不到设备

javascript - Javascript(Ionic)中两个移动设备之间的距离

c# - 没有等同于 CommonCrypto 的 CRC64 实现?

c - 信号量实现

c - 在没有输出的情况下循环遍历C中的数组

raspberry-pi - bluez5 ble 广告在第一次连接后停止

java - Java中的CRC计算