跳至内容

数据打包

字段位域、端序、缩放与 C 宏。

正在准备工具…

字段模型

每个字段由起始位 lsb、宽度 width、符号、缩放 scale 和偏置 offset 定义。工程值先转成原始整数:

r=round⁡(v−offsetscale),w=∑(r∧(2width−1))≪lsb r=\operatorname{round}\left(\frac{v-\mathrm{offset}}{\mathrm{scale}}\right),\qquad w=\sum (r\wedge(2^{\mathrm{width}}-1))\ll\mathrm{lsb}

解码时先取掩码,再按有符号字段做补码扩展,最后乘缩放、加偏置。字段不能重叠,也不能超出字宽;端序只改变输出字节的顺序,不改变字段位的位置。

例:16 位字中 FLAGS 位于 bit 0–3、CODE 位于 bit 4–15 且有符号。FLAGS=10、CODE=-1 得到 0xFFFA,大端字节为 FF FA,小端为 FA FF。

C 宏

头文件为每个字段生成 _POS、_MSK、_GET 和 _SET。_SET 接收原始字段值,缩放和偏置仍由应用层处理;这样宏不依赖浮点,也不会隐藏符号扩展。64 位字使用 uint64_t 和 UINT64_C 风格的掩码。

边界

编码时检查工程值能否落在字段的原始范围内;解码时检查字值不超过位宽。位域重叠、字段名为空或重复、缩放为 0 都会报错。位域布局不做编译器 struct 位域假设,跨编译器时仍以这套掩码为准。

64 位字段通过 JavaScript 数值输入,原始值超过 2532^{53} 时会有精度损失;这种场合应缩小字段宽度,或在上位机直接用 BigInt 处理。