使用binascii.a2b_hex转十六进制字符串遇Odd-length string错误求助
解决binascii.Error: Odd-length string问题
报错原因
binascii.a2b_hex要求输入的十六进制字符串必须是偶数长度——每两位十六进制字符对应1字节二进制数据。你提供的十六进制字符串177B16283F6C72F52DB9F00DF2629EB6F925A67AEF85A93F5588C62DCDB0050长度为63,是奇数,因此触发错误。
问题根源
生成该十六进制字符串的代码"{0:0>4X}".format(int(bin_str,2))存在缺陷:格式符0>4X仅保证输出至少4位,不会自动补全为偶数位。你提供的二进制字符串长度为252位(252÷4=63),对应63位十六进制,正好是奇数,最终输出的字符串长度不符合a2b_hex的要求。
解决方案
方法1:补前导0至偶数长度
生成十六进制字符串后,检查长度是否为奇数,是则在开头补一个0:
bin_str = '0000000101110111101100010110001010000011111101101100011100101111010100101101101110011111000000001101111100100110001010011110101101101111100100100101101001100111101011101111100001011010100100111111010101011000100011000110001011011100110110110000000001010000' hex_str = "{0:X}".format(int(bin_str, 2)) # 补前导0确保偶数长度 if len(hex_str) % 2 != 0: hex_str = '0' + hex_str # 现在转换不会报错 import binascii binary_data = binascii.a2b_hex(hex_str)
方法2:格式化时指定偶数长度
计算所需的最小偶数长度,直接在格式化时补全:
bin_str = '0000000101110111101100010110001010000011111101101100011100101111010100101101101110011111000000001101111100100110001010011110101101101111100100100101101001100111101011101111100001011010100100111111010101011000100011000110001011011100110110110000000001010000' bin_len = len(bin_str) hex_len = (bin_len + 3) // 4 # 计算十六进制最小位数 # 确保十六进制长度为偶数 if hex_len % 2 != 0: hex_len += 1 hex_str = "{0:0>{len}X}".format(int(bin_str, 2), len=hex_len) # 转换二进制数据 import binascii binary_data = binascii.a2b_hex(hex_str)
方法3:使用bytes.fromhex简化转换(需先处理字符串)
bytes.fromhex和binascii.a2b_hex逻辑一致,同样要求偶数长度字符串,处理后可直接使用:
hex_str = "{0:X}".format(int(bin_str, 2)) if len(hex_str) % 2 != 0: hex_str = '0' + hex_str binary_data = bytes.fromhex(hex_str)
内容的提问来源于stack exchange,提问作者91DarioDev
相关产品推荐
相关产品推荐

