Python中处理十六进制字符串(hexstr)的核心方法主要有三种:int()与hex()配合用于数值转换,bytes.fromhex()与hex()用于字节流转换,binascii模块的hexlify/unhexlify提供兼容性更强的接口,选择哪种取决于你的数据格式和处理目标。
Python hexstr 怎么用?核心转换方法一览
新手常以为hexstr只有一种转换方式,其实不同数据类型对应不同入口,行业共识认为,掌握这三大类方法就能覆盖95%以上的开发场景。
整数与十六进制字符串之间的转换
当你手头是个整数,想把它变成十六进制字符串,或者反过来,用int()和hex()就够。
- 整数 → hexstr:
hex(255)返回'0xff',前缀0x是标准标识,想去掉前缀用切片hex(255)[2:],得到'ff'。 - hexstr → 整数:
int('ff', 16)返回255,第二个参数指明基数,注意字符串里不能带0x,否则会报错,但int('0xff', 16)也能正确解析,因为Python能自动识别0x前缀,实际开发中建议统一输入格式,避免歧义。
这个组合适合处理内存地址、颜色值、校验码等纯数字场景,比如解析一个RGB颜色 #FFA500,提取 'FFA500' 后分段用 int(each, 16) 就能得到分量值。
字节序列与十六进制字符串之间的转换
网络数据、加密摘要、文件签名通常以字节形式出现,这时需要的是字节和hexstr的互转。
- 字节 → hexstr:
bytes对象自带hex()方法。b'xffxa5x00'.hex()返回'ffa500',结果不带空格和前缀,最常用。 - hexstr → 字节:
bytes.fromhex('ffa500')返回b'xffxa5x00',参数必须是偶数个十六进制字符,且不能有空格,如'ff a5'会报错,如果字符串带空格或冒号,得先清洗。
binascii 模块提供了 hexlify 和 unhexlify,功能和上面完全一致。binascii.hexlify(b'xffxa5') 返回 b'ffa5'(注意结果是字节串,不是字符串),unhexlify('ffa5') 返回字节,它们和 bytes.fromhex 的区别在于返回类型和性能,具体看下节。
用binascii模块处理无头字符
binascii 还常用来处理已经带空格或冒号的十六进制字符串,'ff a5 00'。unhexlify 不会自动忽略空格,需要先用 replace 去掉,但 bytes.fromhex 同样不支持空格,一种做法是 bytes.fromhex('ffa500'.replace(' ', '')),或者直接切分后逐字节转换,数据量大时效率较低。
Python hexstr 转字符串:三种场景对应三种写法
很多人在问“python hexstr 转字符串”时,其实隐含了两种需求:一是把十六进制数变成可读的ASCII字符,二是把字节中的十六进制表示还原成原始文本,搞混这两个需求会让代码走不少弯路。
纯数字与十六进制字符串互转
如果你有一个十六进制字符串 '48',想把它当做数值 72 来用,用 int('48', 16) 拿到整数,再通过 chr(72) 得到字符 'H',反过来,把字符 'H' 的ASCII码变成十六进制,hex(ord('H')) 得到 '0x48',再切片去掉 0x。
这个场景本质上是在做数值和字符编码的转换,和“字符串”的字节表示不是一回事,很多新手直接用 bytes.fromhex('48') 得到 b'H',虽然结果一样,但概念上绕了弯路bytes.fromhex 是把十六进制字符串解释为字节序列,如果内容恰好是ASCII码,看起来像字符串,但类型是 bytes。
字节数据与十六进制字符串互转
当你需要把一段二进制数据(如文件头、网络包)以十六进制形式展示或传输时,最直接的是
data.hex() 和 bytes.fromhex(hexstr)。
- 写Hex日志:
log_data = data.hex()得到紧凑字符串,便于混入文本日志。 - 读Hex格式的配置文件:
config_bytes = bytes.fromhex(config_str)还原字节。
如果数据量很大(MB级别),可以在循环中分块处理,避免一次性生成超大字符串,内存更友好,业内专家指出,在Python 3.5之后,bytes.fromhex 和 bytes.hex 都是底层C实现,速度远快于纯Python循环拼接,优先级最高。
带分隔符的十六进制字符串处理
Wireshark导出的十六进制数据常长这样 'ff a5 00',或者 'FF:A5:00',处理这类数据时,先统一清洗再转换。
hex_raw = 'ff a5 00'
clean = hex_raw.replace(' ', '').replace(':', '')
result = bytes.fromhex(clean)
如果分隔符不固定,可以用正则 re.sub(r'[^0-9a-fA-F]', '', hex_raw) 去掉所有非十六进制字符,然后直接用 bytes.fromhex,注意 bytes.fromhex 要求输入不含非法字符,所以清洗必须彻底。
常见问题与性能对比
两种方法的性能差异
bytes.fromhex 和 binascii.unhexlify 在功能上等价,但性能有细微差别,据开发者社区测试,在转换10万字节的十六进制字符串时,bytes.fromhex 平均耗时约0.05秒,binascii.unhexlify 约0.06秒,前者略快,但 binascii 模块在Python 2和Python 3之间兼容性更好,如果代码需要跨版本运行,推荐用 binascii,Python 2中 bytes 是 str 的别名,直接调用 hex() 方法会得到不同结果,这是历史遗留问题,现在Python 2已停止维护,新项目直接用 bytes.fromhex 即可。
常见错误:忘记处理0x前缀
int('0xff', 16) 可以工作,但 bytes.fromhex('0xff') 会抛 ValueError,因为字符串里多了 0x,处理用户输入时,务必先 strip('0x') 或 lstrip('x'),同样,hex() 默认带 0x,如果后续要传给 bytes.fromhex,记得切片。
性能优化建议
- 循环中不要反复调用
hex()和int(),可以批量处理。 - 大数据量时用
bytes.fromhex一次性转换,比逐字节int快数十倍。 - 频繁转换建议用
str.maketrans做字符映射,比如把大写转小写。
bytes.fromhex 和 bytes.hex 是官方推荐的首选方案,除非有特殊兼容性需求。
python hexstr 的常见问题解答
如何将十六进制字符串转换为整数?
用 int(hexstr, 16),如果字符串包含 0x 前缀,会正常解析,但建议统一去掉前缀以避免意外,示例:int('ff', 16) 返回 255。
bytes.fromhex() 和 binascii.unhexlify() 有什么区别?
功能完全相同,返回类型都是 bytes,主要区别在于 bytes.fromhex 是Python 3.5引入的方法,更符合面向对象风格;binascii.unhexlify 是模块函数,在Python 2/3中都可用,性能上 bytes.fromhex 略快,但差异微小,如果你的代码需要兼容Python 2,选 binascii;否则直接用 bytes.fromhex 更简洁。
带空格或冒号的十六进制字符串怎么处理?
先清洗再转换,用 hexstr.replace(' ', '').replace(':', '') 去掉分隔符,然后用 bytes.fromhex(clean) 得到字节,如果分隔符不统一,用正则 re.sub(r'[^0-9a-fA-F]', '', hexstr) 一次性去除所有非十六进制字符,千万不要 split 后逐个 int,那样效率低,代码也冗余。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/505938.html



