通信协议里的“高位在前”到底在说什么

关键点在于:这里其实有两个层次的“高位”。

  • 字节层次:多字节数据里先发高字节(更高权重的字节)
  • 位层次:单字节内部先发高位(bit7 到 bit0)

这两个层次彼此独立,不要混为一谈。

例子

12345 = 0x3039 作为例子,它由两个字节组成:

  • 高字节:0x30 = 0011 0000
  • 低字节:0x39 = 0011 1001

以 SPI 的 MSB first 为例:

  • 字节层次:先发高字节,再发低字节
  • 位层次:每个字节都按高位到低位发送

字节层次发送顺序:

第1个:0x30(高字节)
第2个:0x39(低字节)

位顺序:

发送 0x30 时:
位顺序:0 -> 0 -> 1 -> 1 -> 0 -> 0 -> 0 -> 0
        ↑高位                    ↑低位

发送 0x39 时:
位顺序:0 -> 0 -> 1 -> 1 -> 1 -> 0 -> 0 -> 1
        ↑高位                    ↑低位

再看一个反例:LSB first

还是用 0x3039

  • 字节层次(不变):先发 0x30,再发 0x39
  • 位层次(变化):每个字节按低位到高位发送(bit0 到 bit7)

位顺序:

发送 0x30 时:
位顺序:0 -> 0 -> 0 -> 0 -> 1 -> 1 -> 0 -> 0
        ↑低位                    ↑高位

发送 0x39 时:
位顺序:1 -> 0 -> 0 -> 1 -> 1 -> 1 -> 0 -> 0
        ↑低位                    ↑高位