Python 编写将十六进制转换为十进制的函数

Python 编写将十六进制转换为十进制的函数,python,python-2.7,Python,Python 2.7,我需要写一个将十六进制转换成十进制的函数,我已经有了一个方法,但是我在第一位就卡住了。到目前为止,我接受用户输入并以十六进制返回它,但这只在我一次输入一个东西时起作用。代码是: def hex(x): if x == "0": return 0 elif x == "1": return 1 elif x == "2": return 2 elif x == "3": return 3 eli

我需要写一个将十六进制转换成十进制的函数,我已经有了一个方法,但是我在第一位就卡住了。到目前为止,我接受用户输入并以十六进制返回它,但这只在我一次输入一个东西时起作用。代码是:

def hex(x):
    if x == "0":
        return 0
    elif x == "1":
        return 1
    elif x == "2":
        return 2
    elif x == "3":
        return 3
    elif x == "4":
        return 4    
    elif x == "5":
        return 5
    elif x == "6":
        return 6
    elif x == "7":
        return 7
    elif x == "8":
        return 8
    elif x == "9":
        return 9
    elif x == "A":
        return 10
    elif x == "B":
        return 11
    elif x == "C":
        return 12
    elif x == "D":
        return 13
    elif x == "E":
        return 14
    elif x == "F":
        return 15

print hex(raw_input().upper())

如果我输入C,它会工作,然后返回12,但是如果我输入8C,它就不工作了。我不明白为什么会这样。

您可以使用
int
来简化此过程。功能:

def hex_to_dex(strng_of_hex):
    return int(strng_of_hex, 16)
例如:

>>> int("0xff", 16)
255
如果int前面有一个
0x
,这并不重要,它将忽略字符串中的
0x
。因此,以下措施也将起作用:

>>> int("a", 16)
10
对于从头开始的原始十六进制代码,请尝试以下操作:

def hex(s):
    _hexer = "0123456789ABCDEF"
    return sum([_hexer.find(var) * 16 ** i for i, var in enumerate(reversed(s.upper()))])
如果你想让一些警卫进来:

def hex(s):
    _hexer = "0123456789ABCDEF"

    if not all([var in _hexer for var in s.upper()]):
        print "Invalid string"
        return None

    return sum([_hexer.find(var) * 16 ** i for i, var in enumerate(reversed(s.upper()))])
我在这里使用了很多函数,但为了快速参考,这里有一个附录:

  • ->反转字符串

  • 至于
    […]
    ,这是一个列表理解,你可以在上面找到大量的资源。

    你可以使用
    int
    来简化这个过程。功能:

    def hex_to_dex(strng_of_hex):
        return int(strng_of_hex, 16)
    
    例如:

    >>> int("0xff", 16)
    255
    
    如果int前面有一个
    0x
    ,这并不重要,它将忽略字符串中的
    0x
    。因此,以下措施也将起作用:

    >>> int("a", 16)
    10
    
    对于从头开始的原始十六进制代码,请尝试以下操作:

    def hex(s):
        _hexer = "0123456789ABCDEF"
        return sum([_hexer.find(var) * 16 ** i for i, var in enumerate(reversed(s.upper()))])
    
    如果你想让一些警卫进来:

    def hex(s):
        _hexer = "0123456789ABCDEF"
    
        if not all([var in _hexer for var in s.upper()]):
            print "Invalid string"
            return None
    
        return sum([_hexer.find(var) * 16 ** i for i, var in enumerate(reversed(s.upper()))])
    
    我在这里使用了很多函数,但为了快速参考,这里有一个附录:

  • ->反转字符串

  • 至于
    […]
    ,它是一个列表理解,您可以在上面找到大量的资源。

    目前,您正在将用户输入的整个字符串传递给十六进制函数。因此,它适用于“C”,但不适用于“8C”。您没有在if语句中检查“8C”。 因此,十六进制函数返回值
    None
    。 为了防止这种情况发生,您需要将用户输入的字符串一次传递给十六进制函数一个字符

    假设:

    values = raw_input().upper()
    
    并使用问题中定义的
    hex()
    函数。 你可以:

    print([hex(v) for v in values])
    
    或者,如果您不想要列表:

    print(' '.join([str(hex(v)) for v in values]))
    
    这将使用您定义的函数,但将其应用于用户输入的所有字符。。。而不仅仅是第一个


    这个答案的前提是您对定义的
    hex()
    函数的当前功能和返回类型感到满意。

    当前,您正在将用户输入的整个字符串传递给hex函数。因此,它适用于“C”,但不适用于“8C”。您没有在if语句中检查“8C”。 因此,十六进制函数返回值
    None
    。 为了防止这种情况发生,您需要将用户输入的字符串一次传递给十六进制函数一个字符

    假设:

    values = raw_input().upper()
    
    并使用问题中定义的
    hex()
    函数。 你可以:

    print([hex(v) for v in values])
    
    或者,如果您不想要列表:

    print(' '.join([str(hex(v)) for v in values]))
    
    这将使用您定义的函数,但将其应用于用户输入的所有字符。。。而不仅仅是第一个



    这个答案的前提是您对定义的
    hex()
    函数的当前功能和返回类型感到满意。

    如果
    x
    等于字符串
    8C
    ,您的big
    的哪个分支如果。。。elif
    声明您认为会采取什么措施?如果你能回答这个问题,那么你就会明白为什么你的代码不能工作。你需要为用户输入中的每个字符调用
    hex()
    函数;然后收集并打印结果。如果
    x
    等于字符串
    8C
    ,那么大
    的哪个分支如果。。。elif
    声明您认为会采取什么措施?如果你能回答这个问题,那么你就会明白为什么你的代码不能工作。你需要为用户输入中的每个字符调用
    hex()
    函数;然后收集并打印结果。不幸的是,我必须编写自己的函数来完成这项工作。我将通过获取输入字符串的长度,并将第一个数字乘以16乘以长度的幂减1来完成此操作。@JaAnTr Tr最新的加法。
    sum()
    是错误的函数。
    \u hexer.find()
    技巧很可爱,但结果值会非常错误。@MartijnPieters会吗?让我再测试一下。@GamesBrainiac:Btw,
    \u hexer=dict(map(反向,枚举(“0123456789ABCDEF”))
    或者类似的东西会更可爱;-)不幸的是,我必须编写自己的函数来实现这一点。我将通过获取输入字符串的长度,并将第一个数字乘以16乘以长度的幂减1来完成此操作。@JaAnTr Tr最新的加法。
    sum()
    是错误的函数。
    \u hexer.find()
    技巧很可爱,但结果值会非常错误。@MartijnPieters会吗?让我再测试一下。@GamesBrainiac:Btw,
    \u hexer=dict(map(反向,枚举(“0123456789ABCDEF”))
    或者类似的东西会更可爱;-)“但如果我输入8C,它就不起作用了。”我正在解释这一点。他显然对现有的功能很满意“如果我输入,它可以工作,例如,C”。这使用了他定义的十六进制()问题中的一个。啊,那么这仍然是一个问题,因为
    hex()
    返回整数。将其转换为字符串不会产生所需的输出
    C8
    将导致
    128
    ,而不是
    200
    @RMcG:啊,我明白了,对不起。我还以为你是在建议替换提问者的
    hex
    函数呢@史蒂文:没问题,我应该让它更明显。“但如果我输入8C,它就不起作用了。”我正在解释这一点。他显然对现有的功能很满意“如果我输入,它可以工作,例如,C”。这使用了他定义的十六进制()问题中的一个。啊,那么这仍然是一个问题,因为
    hex()
    返回整数。将其转换为字符串不会产生所需的输出<密码