报错“non-hexadecimal digit found”需清洗输入:strip()去首尾空白,replace()清除空格、冒号、短横线等非十六进制字符,并确保字符串长度为偶数且仅含0-9、a-f、a-f。

binascii.unhexlify() 报错 “Non-hexadecimal digit found” 怎么办
这个错误通常是因为输入字符串里混入了空格、换行符或非十六进制字符(比如字母 G 或符号 -)。unhexlify() 要求输入必须是长度为偶数的纯十六进制字符串(只含 0-9、a-f、A-F)。
实操建议:
- 用
strip()去掉首尾空白:s.strip() - 用
replace()清理常见分隔符:s.replace(' ', '').replace(':', '').replace('-', '') - 验证合法性再转换:
if all(c in '0123456789abcdefABCDEF' for c in s): ... - 注意:空字符串
''会返回空字节串b'',不是错误,但可能不符合预期
想把 bytes 转成可读的十六进制字符串,该选 hex() 还是 binascii.hexlify()?
两者都能转,但行为和返回类型不同。Python 内置 bytes.hex() 返回 str,而 binascii.hexlify() 返回 bytes(内容是 ASCII 字符的字节串)。
实操建议:
- 日常调试优先用
my_bytes.hex()—— 简洁、返回字符串、支持sep和bytes_per_sep参数(如.hex(':')) - 只有在需要保持返回值为
bytes类型时才用binascii.hexlify(),比如某些底层协议拼包场景 -
binascii.hexlify(b'abc')返回b'616263',而b'abc'.hex()返回'616263' - 性能上差异极小,不用刻意优化
binascii.b2a_hex() 和 binascii.hexlify() 有啥区别?
完全没区别。b2a_hex() 是 hexlify() 的别名,源码里就是 b2a_hex = hexlify。官方文档也明确标注为“alias”。
实操建议:
- 统一用
binascii.hexlify(),语义更清晰,避免新人困惑 - 不要在同一个项目里混用两个名字,增加维护成本
- PyPI 上部分老代码或兼容 Python 2 的脚本可能还在用
b2a_hex(),迁移到 Python 3 后建议替换
为什么 binascii.a2b_hex(b'616263') 会报 TypeError?
因为 a2b_hex()(即 unhexlify())只接受 str 或 bytes,但如果你传的是 bytes,它内部会尝试 decode 成 str;而如果字节内容不是 UTF-8 编码的文本(比如你误传了原始二进制数据),就会炸。
实操建议:
- 确保输入是十六进制字符串的
bytes形式,且内容可安全解释为 ASCII:binascii.a2b_hex(b'616263')✅ - 如果输入是字符串,直接传
'616263'更稳妥,避免编码歧义 - 常见翻车点:从文件读取 hex 数据后忘了
.decode('ascii'),导致传入的是带 BOM 或换行的 bytes - 万能兜底写法:
binascii.unhexlify(my_input.encode('ascii') if isinstance(my_input, str) else my_input)
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











