物联网设备字节数据转换:4字节signed int及混合格式处理问询
物联网设备字节数据格式转换问题解析
先搞懂2字节有符号整数的转换原理
文档里的((byteArray[0] << 8) + byteArray[1])是基于**大端序(MSB优先)**的转换逻辑:
byteArray[0]是高位字节(MSB),左移8位相当于把它放到16位整数的高8位位置(比如0x12 << 8会变成0x1200)- 加上
byteArray[1]低位字节,就能把两个字节拼接成完整的16位数值 - 注意:Python普通整数运算不会自动处理有符号数的符号位,直接这么算如果是负数(高位字节最高位为1)会得到错误的无符号值,用
int.from_bytes()方法能自动处理符号和字节序,更可靠
你提供的代码存在小问题:input是原始十六进制字符串,input[1]取的是字符串字符而非字节值,应该用data数组元素,修正后的2字节有符号int处理代码如下:
hex_input = "你的十六进制输入字符串" data = bytearray.fromhex(hex_input) # 处理2字节有符号整数(大端序) if data[0] == 0x01: # 直接比较字节值,无需转成bytes wanted_data = int.from_bytes(data[1:3], byteorder='big', signed=True)
问题1:4字节有符号整数的转换方法
优先用int.from_bytes()实现,避免手动处理符号位出错:
# 处理4字节有符号整数(大端序) # 假设data中从索引1开始的4个字节是目标数据 wanted_4byte_int = int.from_bytes(data[1:5], byteorder='big', signed=True)
如果要手动实现(用于理解原理):
# 手动实现大端4字节有符号int转换 byte0 = data[1] byte1 = data[2] byte2 = data[3] byte3 = data[4] # 拼接成无符号32位整数 unsigned_val = (byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3 # 处理符号位:最高位为1则是负数,转补码 if unsigned_val & 0x80000000: wanted_4byte_int = unsigned_val - 0x100000000 else: wanted_4byte_int = unsigned_val
问题2:2字节有符号整数(MSB)+1字节无符号整数(小数部分)的转换方法
这种属于定点数格式,通常1字节小数部分代表1/256的倍数(无符号1字节范围0-255),转换逻辑如下:
- 把2字节有符号整数转成十进制整数
- 把1字节无符号小数部分转成
小数数值 / 256 - 两者相加得到最终浮点数
代码实现:
# 假设data中索引1-2是2字节有符号整数,索引3是1字节小数部分 # 转换整数部分 int_part = int.from_bytes(data[1:3], byteorder='big', signed=True) # 转换小数部分 decimal_part = data[3] / 256 # 最终结果 final_value = int_part + decimal_part
示例:整数部分为0x0001(即1),小数部分为0x80(即128),最终值为1 + 128/256 = 1.5
内容的提问来源于stack exchange,提问作者Chau Loi
相关产品推荐
相关产品推荐

