整数格式转换 16 位 32 位 字节序切换
什么时候需要整形转换
网络上传送的整数可能以不同方式编码:
- 不同位宽(16 位 vs 32 位)。
- 不同字节序(大端 vs 小端)。
- 有符号还是无符号。
从设备收到一串 HEX 数据后,需要正确解释这些字节代表的整数值。
支持的转换类型
| 参数 | 选项 | 说明 |
|---|---|---|
| 位宽 | 8 / 16 / 32 / 64 位 | 半个字节到 8 字节 |
| 字节序 | 小端 / 大端 | 内存排列顺序 |
| 有符号性 | 有符号 / 无符号 | 最高位是否作为符号位 |
小端 vs 大端实例
HEX 值 0102(两字节):
- 16 位小端 → 十进制
513(0x0201) - 16 位大端 → 十进制
258(0x0102)
同一个字节序列,字节序不同,整数值不同。
有符号 vs 无符号
HEX 值 FF(单字节):
- 8 位无符号 →
255 - 8 位有符号 →
-1(补码表示)
对于有符号整数,最高位是符号位——0 表示正数,1 表示负数,负数用补码编码。
与 Modbus 寄存器配合
Modbus 寄存器是 16 位的。如果设备用两个寄存器组合成一个 32 位整数,需要:
- 先读两个寄存器的原始值。
- 确认设备用的是"高寄存器在前"还是"低寄存器在前"(对应大端还是小端)。
- 用整形转换工具把两个 16 位值拼成一个 32 位整数。
调试场景
场景:解析传感器上报的 3 字节时间戳
有用户提到传感器用 3 字节存储毫秒时间戳,但 NetAssist 的整形转换工具原来只有 2 和 4 字节选项。官方已表示下个版本会增加 3 字节整型支持。当前版本的变通方法是:用 HEX 模式手动截取,在外部计算。
场景:确认设备字节序
让设备发送一个已知值(比如 0x12345678),观察收到的字节序列:
- 如果收到
12 34 56 78→ 大端 - 如果收到
78 56 34 12→ 小端
然后就可以在所有后续转换中正确选择字节序。