1

我需要编写一个将十六进制转换为十进制的函数,并且我知道如何做到这一点,但我被困在了第一位。到目前为止,我正在接受用户输入并以十六进制返回它,但这仅在我一次输入 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 则它不起作用。我不明白为什么会这样。

4

2 回答 2

5

您可以使用它int来简化此操作。功能:

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

例子:

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

0x如果你有int 的 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. 枚举
  3. reversed -> 反转字符串

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

于 2013-10-26T10:10:50.317 回答
0

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

假设:

values = raw_input().upper()

并使用您hex()的问题中定义的功能。你可以:

print([hex(v) for v in values])

或者如果您不想要列表:

print(' '.join([str(hex(v)) for v in values]))

这使用您定义的函数,但将其应用于用户输入的所有字符......而不仅仅是第一个字符。

这个答案是在您对当前功能和定义函数的返回类型感到满意的假设下工作的hex()

于 2013-10-26T10:15:23.150 回答