You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

字节序问题:十六进制转十进制需小端序,使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 14:48:04