Python中如何将3字节、6字节大端补码bytes实例转换为int类型?
方案1:使用int.from_bytes(推荐,Python 3.2+支持)
Python内置的int.from_bytes方法支持任意长度的bytes转换,不需要依赖struct模块,也不受标准字节长度限制,刚好适配你的需求:
# 3字节大端补码转int def bytes3_to_int(b: bytes) -> int: if len(b) != 3: raise ValueError("输入字节长度必须为3") return int.from_bytes(b, byteorder="big", signed=True) # 6字节大端补码转int def bytes6_to_int(b: bytes) -> int: if len(b) != 6: raise ValueError("输入字节长度必须为6") return int.from_bytes(b, byteorder="big", signed=True)
示例运行效果:
- 输入
b'\x00\x00\x7f'调用bytes3_to_int,返回127 - 输入
b'\xff\xff\x80'调用bytes3_to_int,返回-128
方案2:兼容旧Python版本(基于struct补位实现)
如果需要适配Python 3.2以下版本,可以手动对字节做符号位扩展,补到struct支持的标准长度后再解析:
import struct def bytes3_to_int(b: bytes) -> int: if len(b) != 3: raise ValueError("输入字节长度必须为3") # 符号位扩展为4字节,匹配struct的>i格式(4字节大端有符号整数) pad = b'\xff' if (b[0] & 0x80) else b'\x00' return struct.unpack(">i", pad + b)[0] def bytes6_to_int(b: bytes) -> int: if len(b) != 6: raise ValueError("输入字节长度必须为6") # 符号位扩展为8字节,匹配struct的>q格式(8字节大端有符号整数) pad = b'\xff\xff' if (b[0] & 0x80) else b'\x00\x00' return struct.unpack(">q", pad + b)[0]
你解析SQLite文件格式的场景直接使用方案1即可,逻辑简单,性能也更高。
内容的提问来源于stack exchange,提问作者Michal Charemza
相关产品推荐
相关产品推荐

