
前言打包负责发送前拼装字节解包是它的逆操作。我们读传感器、ADC、电源芯片的寄存器时一个字节里面往往挤着就绪标志、故障码、量程参数这时候就需要位域解包把混杂在一起的字段拆分出来。本文配套上篇打包的逻辑讲解(val n) mask这套固定解法给出掩码计算技巧、多字段拆分示例读懂 datasheet 的寄存器位图全靠它。一、解包通用范式field (packed_val offset) mask;参数说明offset目标字段最低 bit 在打包字节里的位置和解包对应的打包偏移完全一致右移把目标字段整体向右拉对齐到 bit0mask掩码用来保留有效 bit、屏蔽高位无关数据掩码宽度等于字段 bit 宽度。核心一句话先右移对齐低位再掩码截取。二、案例 1解包 I2C 寻址字节打包篇案例反向打包布局bit7~bit1 是 7bit 地址bit0 是 R/Wuint8_t rw (byte 0) 0x01; uint8_t addr7 (byte 1) 0x7F;0x011bit 掩码0x7F 0b011111117bit 掩码三、案例 2解包 SPI 式命令字节R/W 在 bit7布局bit7R/Wbit6~bit07bit 地址uint8_t rw (byte 7) 0x01; uint8_t addr7 (byte 0) 0x7F;四、拓展多字段解包对应打包篇多字段例子打包pack (cmd 5) | parambit7~bit5cmd3bitbit4~bit0param5bituint8_t cmd (pack 5) 0x07; // 0x07 是3bit掩码 0b111 uint8_t param (pack 0) 0x1F; // 0x1F 是5bit掩码 0b11111五、掩码快速计算技巧掩码 ( (1U bit_width) - 1 )1bit(11)-1 0x013bit(13)-1 0x075bit(15)-1 0x1F7bit(17)-1 0x7F写宏自动生成掩码工程很常用#define MASK(w) ((1U (w)) - 1U)六、什么时候必须掌握解包读取传感器、ADC、电源芯片的状态寄存器寄存器里面塞满标志位写 I2C/SPI 从机收到主机下发的打包命令第一件事就是解包自定义串口 / RS485 通信协议接收端解析帧阅读 datasheet 寄存器位图看懂每一位代表的含义。补充只读写 AT24C02 这种纯数据流 EEPROM解包写得少但只要碰传感器寄存器解包是高频代码。七、打包和解包对照总表操作用途模板方向打包发送前拼装字段(field offset)...左移就位、按位或解包收到后拆分字段(val offset) mask右移对齐、掩码截取八、解包篇小结解包是打包的逆过程解包固定两步右移对齐 bit0掩码截取有效位偏移 offset 和打包时的 offset 一一对应解包只用右移 掩码解包不用左移。配套阅读《位域打包看懂 I2C 地址左移的底层逻辑》