求助:带0x前缀的十六进制转十进制Python代码错误排查
十六进制字符串转十进制代码错误分析与修复
代码中的错误点
- 索引使用错误:多处写了
digit[len],len是Python内置函数,不是索引值,应该用循环中的bit_index来获取当前处理的字符。 - 变量名拼写错误:判断小写十六进制字符时,错误写成
hex[len],实际要操作的是输入的digit变量,应改为digit[bit_index]。 - 提前返回结果:
return sum被放在while循环内部,导致循环只执行一次就直接返回,无法处理所有十六进制字符。 - 错误处理不合理:遇到无效字符时把
sum设为1后break,会返回错误数值,应该抛出异常或返回明确的错误标识。 - 内置函数名滥用:用
sum做变量名,会覆盖Python内置的sum()函数,建议改用total这类名称。
修复后的代码
def hex_char_decode(digit): # 移除0x前缀 if digit.startswith("0x"): digit = digit[2:] total = 0 length = len(digit) for i in range(length): char = digit[i] if "0" <= char <= "9": res = int(char) elif "A" <= char <= "F": res = ord(char) - 55 elif "a" <= char <= "f": res = ord(char) - 87 else: raise ValueError(f"无效的十六进制字符: {char}") # 计算当前字符的权重,最左侧为最高位 total += res * (16 ** (length - 1 - i)) return total if __name__ == "__main__": hexa = input("请输入带0x前缀的十六进制字符串: ") try: result = hex_char_decode(hexa) print(f"转换后的十进制数: {result}") except ValueError as e: print(e)
说明
- 用
startswith()判断前缀,代码更简洁易读。 - 替换
while循环为for循环,逻辑更清晰,避免索引混乱。 - 遇到无效字符时抛出
ValueError,并通过异常捕获给出友好提示。 - 调整权重计算逻辑,从左到右处理字符,更符合十六进制转十进制的直观逻辑。
内容的提问来源于stack exchange,提问作者Angels Vásquez
相关产品推荐
相关产品推荐

