为何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
相关产品推荐
相关产品推荐

