You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:带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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 15:25:14