You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

蓝牙核心规范AUX_ADV_IND示例是否存在CRC计算勘误?

蓝牙BLE扩展广播PDU的CRC验证疑问

蓝牙核心规范第6.C.4.2.2节(第2909页)给出了一个扩展广播PDU示例:

PDU:
11100000 00001000 01010010 10010010 01110101 10110101 00110101
11010101 01010101 10010101 00111101 01010111 01101011 10100000
11100000 10010000 11010000 10110000
CRC:
00011011 11000100 01110101

数据包的上述部分是第6.B.3.1.1节(第2733-2734页)定义的CRC算法唯一处理的内容。通过以下Perl脚本生成的白化序列可以验证原始PDU的正确性(两者完全匹配,无错误):

$ perl -e '$c=0x71;$a="11100000 00001000 01010010 10010010 01110101 "
   ."10110101 00110101 11010101 01010101 10010101 00111101 01010111 "
   ."01101011 10100000 11100000 10010000 11010000 10110000 00011011 "
   ."11000100 01110101"; for$d(0..length($a)-1){$e=substr($a,$d,1); 
   if($e=~y/01//){$c+=$c;if($c&0x80){$c^=0x91;$e=~y/01/10/;}} 
   print$e;}print"
";'
00011100 01111110 01111011 11101111 00100101 00000010 10101001
01111001 10010100 00100000 11101100 11000110 01101001 11101101
11011101 01010011 00101000 01011100 01001001 00111110 11010100

但我无法重现示例中给出的CRC值。按照规范,广播数据包的CRC移位寄存器应预设为常量0x555555,这也是CRC RevEng工具的默认设置:

$ reveng -m crc-24/ble -c 07104a49aeadacabaaa9bcead60507090b0d
a68bc4

转换为二进制后结果如下:

01100101 11010001 00100011

将消息的第一个字节0x07修改为0x27,就能得到示例中给出的CRC值(以下为十六进制等价形式):

$ reveng -m crc-24/ble -c 27104a49aeadacabaaa9bcead60507090b0d
d823ae

但白化序列已经验证了原始PDU的正确性(否则两者都会出错)。另外,改用修改后的初始向量0x515555也能得到相同结果,效果和上述比特翻转一致:

$ reveng -m crc-24/ble -i 515555 -c 07104a49aeadacabaaa9bcead60507090b0d
d823ae

这个0x515555常量并未在蓝牙规范中提及,也没有任何线索说明它的推导方式。

因此我有以下疑问:

  • 此场景下CRC初始向量是否应为0x515555?
  • 规范中的PDU示例是否存在错误?
  • 还是示例中的CRC计算本身有误?

内容的提问来源于stack exchange,提问作者regregex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 04:27:30