读取文件十六进制字符串触发binascii.Error(奇数长度)问题求助
解决binascii.Error: odd length string问题
这个错误的根源很明确:你提取的message并不是纯十六进制字符串——它还包含了Python字节字面量的标记b'和结尾的',导致字符串总长度变成了奇数(比如你提供的例子里,原十六进制是64个字符,加上b'和'后变成67个字符,奇数长度),而binascii.unhexlify()要求输入必须是偶数长度的纯十六进制字符串。
修正步骤
你只需要在提取字符串后,去掉多余的标记,保留中间的纯十六进制部分即可。有两种简单的方式:
方法1:使用切片截取核心内容
因为b'xxx'格式的字符串,有效内容从索引2开始,到倒数第1个字符结束(最后一个字符是'),所以可以直接切片:
import binascii u_input = input("请输入文件名: ") with open(u_input) as fp: read_lines = fp.readlines() read_message = read_lines[0].split() # 去掉b'开头和'结尾的部分 message = read_message[2][2:-1] print("Message: %s"% message) uncombine = binascii.unhexlify(message) print("decrypt: %s"%uncombine)
方法2:使用strip()移除标记
如果不确定标记的位置(比如偶尔可能有空格),可以用strip()移除两端的b'和':
message = read_message[2].strip("b'")
额外建议
为了避免后续出现其他格式问题,你可以添加一个简单的校验,确保处理后的字符串是偶数长度:
if len(message) % 2 != 0: raise ValueError("提取的十六进制字符串长度为奇数,请检查文件内容格式")
这样就能确保输入符合unhexlify()的要求,顺利完成解密操作了。
内容的提问来源于stack exchange,提问作者User1491
相关产品推荐
相关产品推荐

