本文详解如何将形如 "48656c6c6f" 的十六进制字符串正确解析为 ASCII 字符串,避免 int() 与 chr() 组合使用时因类型错误导致的崩溃,并推荐简洁、健壮的标准库方案。
本文详解如何将形如 "48656c6c6f" 的十六进制字符串正确解析为 ascii 字符串,避免 `int()` 与 `chr()` 组合使用时因类型错误导致的崩溃,并推荐简洁、健壮的标准库方案。
你遇到的错误:
TypeError: 'str' object cannot be interpreted as an integer
根本原因在于这一行代码:print(chr(hex(int(sel,16))))
其中 hex(int(sel,16)) 返回的是一个字符串(例如 '0x48'),而 chr() 只接受整数参数——传入字符串自然会抛出 TypeError。
❌ 错误写法分析(原始逻辑问题)
for i in range(0, len(text), 2):
sel = "0x" + text[i:i+2] # 如 text="4865", 则 sel="0x48"
print(chr(hex(int(sel,16)))) # ❌ hex() → str → chr() 报错- int("0x48", 16) 正确返回整数 72;
- 但 hex(72) 返回字符串 '0x48',而非 72;
- chr('0x48') 尝试将字符串转为字符 → 类型错误。
✅ 推荐解决方案:bytes.fromhex().decode()
Python 标准库提供了专为此类场景设计的简洁方法:
text = "48656c6c6f" # "Hello" 的十六进制表示
result = bytes.fromhex(text).decode('ascii')
print(result) # 输出: Hello✅ 优势显著:
- 一步到位:自动按两位分组、解析十六进制、组合为字节序列;
- 健壮安全:自动校验输入是否为有效十六进制(非法字符如 'g' 会抛出 ValueError);
- 编码明确:.decode('ascii') 显式指定解码方式,避免隐式编码歧义;若需支持 Unicode(如 UTF-8 编码的 hex),可改为 .decode('utf-8')。
? 补充:若坚持手动逐字节处理(教学/调试用)
确保 chr() 接收整数,移除多余的 hex():
text = "48656c6c6f"
chars = []
for i in range(0, len(text), 2):
byte_hex = text[i:i+2] # 如 "48"
byte_int = int(byte_hex, 16) # → 72
chars.append(chr(byte_int))
result = ''.join(chars)
print(result) # Hello⚠️ 注意事项:
- 输入 text 长度必须为偶数,否则 text[i:i+2] 可能截取单字符,导致 int(..., 16) 失败;
- 确保所有字符均为合法十六进制(0-9, a-f, A-F),否则 int() 抛出 ValueError;
- bytes.fromhex() 内部已做严格校验,是生产环境首选。
✅ 总结
优先使用 bytes.fromhex(text).decode('encoding') —— 它语义清晰、性能优异、错误提示友好。避免在 int() 后误调 hex(),牢记:chr() 的输入必须是整数,而非十六进制字符串。

















