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

为何Python的bytes.fromhex()仅接受至少两位十六进制数?

为什么bytes.fromhex()不接受单个十六进制字符?

先看Python里的两个相关行为:

>>> hex(0)
'0x0'

当我们把hex(0)[2:](也就是'0')传给bytes.fromhex()时会触发报错:

>>> bytes.fromhex(hex(0)[2:])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: non-hexadecimal number found in fromhex() arg at position 1

而传入两位的十六进制字符串'00'则能正常生成字节:

>>> bytes.fromhex('00')
b'\x00'

核心原因

这是bytes.fromhex()的设计逻辑决定的:

  • 它要求输入的十六进制字符串按每两位一组解析成一个字节。因为一个字节占8个二进制位,单个十六进制字符只能表示4个二进制位(范围0-15,对应0x0到0xF),两个十六进制字符刚好能凑成完整的8位字节。
  • 如果输入字符串长度为奇数,最后剩下的单个字符无法组成完整字节,函数会直接判定为无效输入并抛出报错。
  • 这种设计也符合行业通用的字节表示惯例,比如二进制文件的十六进制输出、网络数据包的十六进制日志,都是用两位十六进制数对应一个字节。

实用处理方法

如果要把数字转成适配bytes.fromhex()的字符串,可以用格式化字符串确保输出两位十六进制数(不足补零):

>>> f"{0:02x}"  # 02x表示固定输出两位十六进制数
'00'
>>> bytes.fromhex(f"{0:02x}")
b'\x00'

内容的提问来源于stack exchange,提问作者bux

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 14:58:11