推荐使用 bytes.hex():python 3.5+ 原生方法,语义清晰、性能好,返回小写十六进制字符串;binascii.hexlify() 返回 bytes 需 decode,已非首选;注意输入必须为 bytes 类型,字符串需先用 bytes.fromhex() 解析。

直接用 binascii.hexlify() 或 bytes.hex(),后者更推荐——Python 3.5+ 原生支持,无需导入,语义清晰,性能也好。
用 bytes.hex() 是最简方案
这是 Python 3.5 引入的内置方法,专为 bytes 对象设计,返回小写十六进制字符串,无空格、无前缀:
- 输入必须是
bytes类型,不是str或bytearray(后者需先转bytes) - 默认不加
0x前缀,也不分隔,如b'\x0a\x1f'→'0a1f' - 支持可选参数
sep和bytes_per_sep(Python 3.8+),例如data.hex(sep=':', bytes_per_sep=2)得到'0a:1f'
data = b'\xde\xad\xbe\xef' print(data.hex()) # 'deadbeef' print(data.hex(sep=' ', bytes_per_sep=2)) # 'de ad be ef'
为什么不用 binascii.hexlify()?
它仍可用,但已非首选:
- 返回的是
bytes(如b'deadbeef'),常需额外调用.decode()转成str - 旧代码中常见,但新项目没必要绕这个弯
- 在极少数嵌入式或受限环境中(如某些 MicroPython 变体)可能未实现
.hex(),此时才考虑回退
import binascii
data = b'\x01\x02'
hex_bytes = binascii.hexlify(data) # b'0102'
hex_str = hex_bytes.decode('ascii') # '0102'
常见错误:把字符串误当二进制数据
如果原始数据是十六进制字符串(如 'deadbeef'),想“转成十六进制”其实是误解——它已经是了;真正需要的是解析为字节再处理:
-
'deadbeef'是str,不是二进制,不能直接调.hex() - 要还原为字节,用
bytes.fromhex('deadbeef')(注意不带0x) - 若字符串带
0x前缀,先切掉或用int(x, 16).to_bytes(...),但易出错,优先用fromhex()
s = 'deadbeef' b = bytes.fromhex(s) # b'\xde\xad\xbe\xef' print(b.hex()) # 'deadbeef' —— 这才是 round-trip 验证
最容易被忽略的是类型检查:传给 .hex() 的必须是 bytes。从文件读、网络接收、或 struct.pack() 得到的数据通常是 bytes,但从 JSON、用户输入或某些 API 返回的“十六进制”大概率是字符串,混淆这两者会导致 AttributeError 或静默错误。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











