怎样在Python中将二进制数据转换为十六进制字符串?

怎样在Python中将二进制数据转换为十六进制字符串?

Python

推荐使用 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 类型,不是 strbytearray(后者需先转 bytes
  • 默认不加 0x 前缀,也不分隔,如 b'\x0a\x1f''0a1f'
  • 支持可选参数 sepbytes_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()

它仍可用,但已非首选:

Python 3.14.3

微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。

  • 返回的是 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 或静默错误。

本文地址:https://www.sztg.com.cn/article/690606.html

如非特殊说明,本站内容均来自于网友自主分享,如有任何问题均请联系我们进行处理!

猜您喜欢