编写一个函数将十六进制转换为十进制

时间:2013-10-26 10:08:00

标签: python python-2.7

我需要编写一个将十六进制转换为十进制的函数,我已经知道如何做到这一点,但我已经陷入了第一位。到目前为止,我正在接受用户输入并以十六进制形式返回,但这只有在我一次输入1个内容时才有效。代码是:

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则不起作用。我无法弄清楚为什么会这样。

2 个答案:

答案 0 :(得分:5)

您可以使用int让这更容易。功能:

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

示例:

>>> int("0xff", 16)
255

如果int为0x infront并不重要,它将忽略字符串中的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()))])

我在这里使用了很多功能,但为了快速参考,这是一个附录:

  1. str.find
  2. enumerate
  3. reversed - >翻转字符串
  4. sum
  5. 至于[...],它是一个列表理解,你可以找到大量的资源。

答案 1 :(得分:0)

目前,您正在将用户输入的整个字符串传递给您的十六进制函数。因此,它适用于'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()函数的当前功能和返回类型感到满意的假设。