字节序问题:十六进制转十进制需小端序,使用struct函数报错如何解决
十六进制大小端转换报错修复方案
两次报错的核心问题是对f3.read()返回的bytes对象做了多余的str()强制转换:
- 首次报错:
f3.read(4)返回的是ASCII编码的十六进制bytes(示例值b'10b5'),直接用str()转换后会得到带b'前缀、'后缀的普通字符串"b'10b5'",其中b、单引号都不属于合法十六进制字符,触发fromhex参数非法错误。 - 第二次报错:
u16ModuleID_hex[0][2:]是错误的索引逻辑,转换后的字符串首字符为b,[0]取到的是单个字符,切片后剩余内容长度无法满足struct解包需要的2字节缓冲区,触发长度错误。
修复代码
直接对读取到的bytes做ASCII解码即可,不需要额外的类型转换:
import struct # 读取4位十六进制对应的ASCII bytes,解码为纯十六进制字符串 u16ModuleID_hex = f3.read(4).decode('ascii') # 4位十六进制刚好对应2字节字节数组 ba = bytearray.fromhex(u16ModuleID_hex) # 小端序解包,unpack返回元组,取第一个元素即为最终数值 u16ModuleID_dec = struct.unpack("<h", ba)[0]
可选无struct实现
如果不想依赖struct库,也可以直接通过整数位运算实现大小端转换:
u16ModuleID_hex = f3.read(4).decode('ascii') val = int(u16ModuleID_hex, 16) # 大小端字节交换 u16ModuleID_dec = (val >> 8) | ((val & 0xff) << 8) # 有符号数处理(对应signed short类型,如果是无符号可删除下面两行) if u16ModuleID_dec > 32767: u16ModuleID_dec -= 65536
内容的提问来源于stack exchange,提问作者immonual
相关产品推荐
相关产品推荐

