Python中binascii.a2b_hex转换十六进制至二进制结果异常如何解决?
问题解析与解决方法
原因说明
你看到的\n、gd并不是转换错误,而是Python对字节串的默认显示规则导致的:
- Python在打印字节串时,会把对应ASCII码的可打印字符直接显示为字符本身,而非十六进制转义:
- 十六进制
0A对应ASCII换行符,所以显示为\n - 十六进制
67是ASCII的g,64是d,所以这两个字节直接显示为gd
- 十六进制
- 而像
FE、B1、A8这类不在可打印ASCII范围内的字节,就会以十六进制转义形式(\xfe、\xb1)显示。
本质上binascii.a2b_hex的转换结果是完全正确的,只是显示方式让你产生了误解。
验证与处理方法
1. 验证转换正确性
可以把转换后的字节串再转回十六进制,确认和原输入一致:
import binascii hex_input = "FEB10AA86764FFFF" byte_result = binascii.a2b_hex(hex_input) # 转回十六进制并打印 print(binascii.hexlify(byte_result).decode('utf-8')) # 输出:FEB10AA86764FFFF
2. 强制以十六进制转义形式显示所有字节
如果希望看到统一的十六进制转义格式,而非混合可打印字符,可以自定义格式化输出:
# 逐个字节格式化 formatted_bytes = ''.join([f'\\x{b:02x}' for b in byte_result]) print(f"b'{formatted_bytes}'") # 输出:b'\xfe\xb1\x0a\xa8\x67\x64\xff\xff'
3. 逐个查看字节的十进制/十六进制值
也可以遍历字节串,查看每个字节的具体数值:
for idx, b in enumerate(byte_result): print(f"第{idx+1}个字节:十进制{b},十六进制{b:02X}") # 输出: # 第1个字节:十进制254,十六进制FE # 第2个字节:十进制177,十六进制B1 # 第3个字节:十进制10,十六进制0A # 第4个字节:十进制168,十六进制A8 # 第5个字节:十进制103,十六进制67 # 第6个字节:十进制100,十六进制64 # 第7个字节:十进制255,十六进制FF # 第8个字节:十进制255,十六进制FF
内容的提问来源于stack exchange,提问作者WonSeok JIN
相关产品推荐
相关产品推荐

