BLE Link Layer【Bit Ordering】:为什么 b0 b1 b2 = 110 表示 3,而不是 6?
2026/6/30 4:31:23 网站建设 项目流程

下面这部分是 BLE Link Layer 规范里的Bit ordering(比特顺序)。它主要讲的是:规范中字段的 bit 怎么编号、空口发送时 bit 的先后顺序、多个 octet 字段的发送顺序,以及图示中的字段发送顺序。


一、原文翻译

1.2 Bit ordering

1.2 比特顺序

在 Link Layer 规范中,当定义 packet 或 Protocol Data Unit,简称 PDU,里面的字段时,比特顺序遵循little-endian格式。适用以下规则:

  • Least Significant Bit,简称 LSB,对应b0

  • LSB 是第一个通过空口发送的 bit

  • 在图示中,LSB 显示在左侧

此外,在 Link Layer 中定义的数据字段,例如 PDU header 字段,应当以LSB first的方式发送。

例如,一个 3-bit 参数X = 3的发送方式如下:

b0 b1 b2 = 110

在空口中,1先发送,接着发送1,最后发送0
在规范中,这会显示为110

规范中按照0b10101010这种格式指定的二进制字段值,书写时是MSB 在左侧

例如 Section 2.1.2 中 advertising physical channel Access Address,就是按照这种方式写的。

多 octet 字段,除了 Cyclic Redundancy Check,简称 CRC,以及 Message Integrity Check,简称 MIC 之外,应当以least significant octet first的方式发送。

每个 octet 内部,除了 CRC 之外,应当以LSB first的顺序发送。

例如,advertising physical channel PDU 中的 48-bit 地址,应当先发送最低有效 octet,然后按照递增顺序发送剩余 5 个 octet。

规范中指定的多 octet 字段值,书写时是most significant octet 在左侧

例如0x112233445566,其中 octet0x11是 most significant octet。

当一个 packet 或 PDU 在图中显示为包含多个字段时,这些字段应当按照图中显示的顺序发送,最左侧字段先发送。


二、必要 Tip

Tip 1:这部分最核心的问题是“规范怎么看,空口怎么发”

这部分内容非常容易让人混乱,因为它同时涉及三件事:

1. bit 编号怎么定义 2. 规范里的字段值怎么书写 3. 空口实际发送顺序是什么

简单说:

规范书写:经常按人类习惯,MSB 写在左边 空口发送:很多字段按 LSB first 发送 多 octet 字段:通常 least significant octet first 图中字段:字段本身按图中从左到右发送

所以不能只看规范里的显示顺序,就直接认为空口也是完全按这个视觉顺序逐 bit 发送。


Tip 2:LSB 是 b0,并且通常先发

规范明确说:

The Least Significant Bit (LSB) corresponds to b0. The LSB is the first bit sent over the air.

也就是说:

b0 是最低有效 bit b0 通常也是第一个在空口发送的 bit

例如一个 3-bit 字段:

X = 3

二进制值是:

3 = 0b011

如果字段定义为:

b0 b1 b2

那么:

b0 = 1 b1 = 1 b2 = 0

所以规范显示成:

b0 b1 b2 = 110

空口发送顺序也是:

先发 b0 = 1 再发 b1 = 1 最后发 b2 = 0

也就是:

1 -> 1 -> 0

这里最容易误解的是:
110不是说这个值等于二进制0b110,而是在按b0 b1 b2的顺序展示每个 bit。


Tip 3:b0 b1 b2 = 110不等于普通二进制写法0b110

这个点非常关键。

在普通二进制写法里:

0b110 = 6

因为普通二进制默认是:

MSB 在左,LSB 在右

但是规范这里写:

b0 b1 b2 = 110

它表达的是:

b0 = 1 b1 = 1 b2 = 0

所以字段值其实是:

X = b0 × 2^0 + b1 × 2^1 + b2 × 2^2 X = 1 × 1 + 1 × 2 + 0 × 4 X = 3

因此:

b0 b1 b2 = 110

表示的值是3,不是6

这是看 BLE Link Layer 字段定义时很容易踩坑的地方。


Tip 4:0b10101010这种写法仍然是 MSB 在左

规范后面又说:

Binary field values specified in the specification that follow the format 0b10101010 are written with the MSB to the left.

意思是:

只要规范用 0bxxxx 这种格式写二进制值,就是 MSB 在左。

比如:

0b10101010

这个时候就不要再按b0 b1 b2...的展示方式理解。

它就是普通二进制写法:

最左边是 MSB 最右边是 LSB

所以要区分两种表达:

b0 b1 b2 = 110

这是按 bit 编号顺序展示。

0b110

这是普通二进制数值写法,MSB 在左。

二者不能混为一谈。


Tip 5:多 octet 字段通常是 least significant octet first

规范说:

Multi-octet fields ... shall be transmitted with the least significant octet first.

也就是说,多 octet 字段通常是:

低字节先发 高字节后发

例如规范中写一个 6 字节字段值:

0x112233445566

其中:

0x11 是 most significant octet 0x66 是 least significant octet

因为多 octet 字段通常 least significant octet first,所以空口发送 octet 顺序是:

0x66 -> 0x55 -> 0x44 -> 0x33 -> 0x22 -> 0x11

但是注意:这是“octet 顺序”。

每个 octet 内部的 bit 发送顺序,通常仍然是 LSB first。


Tip 6:BLE 地址字段发送时也是低字节先发

规范里举了 48-bit address 的例子。

例如一个地址值写作:

A1:B2:C3:D4:E5:F6

从多 octet 字段值的书写角度看,可以理解为:

0xA1B2C3D4E5F6

其中:

A1 是 most significant octet F6 是 least significant octet

那么作为 48-bit 地址字段发送时,空口 octet 顺序通常是:

F6 -> E5 -> D4 -> C3 -> B2 -> A1

但是很多 App 或抓包工具显示地址时,通常显示为:

A1:B2:C3:D4:E5:F6

所以不要把“工具显示顺序”和“空口发送顺序”直接等同。

这也是为什么看广播包 raw data、HCI Event、空口抓包时,经常会遇到地址字节顺序看起来反过来的情况。


Tip 7:CRC 和 MIC 是例外,不能机械套用所有规则

规范中特别提到:

with the exception of the Cyclic Redundancy Check (CRC) and the Message Integrity Check (MIC)

也就是说,多 octet 字段的发送顺序规则,CRC 和 MIC 有例外。

尤其 CRC 在 BLE Link Layer 中有自己专门的生成、移位和发送规则。
所以看到 CRC 时,不要简单套用:

多字节字段 = 低字节先发 每字节 = LSB first

CRC 要回到 CRC 对应章节单独看。


Tip 8:图里的多个字段,是左边字段先发

最后一句也很重要:

Where a packet or PDU is shown in a figure as containing more than one field, the fields shall be transmitted in the order shown in the figure, leftmost first.

意思是:

如果图中一个 packet 或 PDU 包含多个字段,那么字段按照图中的顺序发送,最左边字段先发送。

注意这里说的是“字段顺序”,不是字段内部的 bit 顺序。

也就是说:

字段之间:图中从左到右发送 字段内部:按字段自己的 bit / octet ordering 规则发送

例如一个图中画成:

Field A | Field B | Field C

那么字段发送顺序是:

Field A -> Field B -> Field C

但是 Field A 内部每个 bit 或每个 octet 怎么发,还要看它自己的字段定义。


Tip 9:不要把 bit ordering、byte ordering、字段顺序混成一件事

看 BLE 规范时,至少要分清三层顺序:

1. 字段顺序 Field order 2. 字节顺序 Octet order / Byte order 3. bit 顺序 Bit order

它们不是同一个概念。

字段顺序

图中多个字段:

Preamble | Access Address | PDU | CRC

发送顺序是:

Preamble 先发 Access Address 后发 PDU 再发 CRC 最后发

字节顺序

多 octet 字段通常:

least significant octet first

也就是低字节先发。

bit 顺序

每个 octet 内部通常:

LSB first

也就是低 bit 先发。

所以 BLE Link Layer 里的“顺序”不能只用一句“大端”或“小端”概括,必须看具体层级。


Tip 10:为什么这部分对 HCI 和广播包解析很重要?

你之前一直在看 BLE Legacy 广播、HCI Command、Advertising Data、Scan Response Data、Advertising Report,这部分其实非常有用。

因为当你解析这些内容时,经常会遇到:

字段值在规范中是一个顺序 HCI Event 里显示是一个顺序 抓包工具里显示又是一个顺序 空口实际发送顺序可能还不同

比如:

Device Address Access Address PDU Header Advertising Data Company Identifier UUID CRC

这些字段都可能涉及 bit 顺序、byte 顺序或者显示顺序的问题。

如果不了解这部分,就容易出现:

为什么地址字节顺序反了? 为什么规范写的 bit 和我理解的数值对不上? 为什么 b0 b1 b2 = 110 代表 3,不是 6? 为什么多字节字段显示是 0x112233445566,但发送时从 0x66 开始?

所以这部分虽然短,但它是后面看 PDU 格式、地址字段、Access Address、Header bit 位定义时的基础。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询