我需要编写一个将十六进制转换为十进制的函数,我已经知道如何做到这一点,但我已经陷入了第一位。到目前为止,我正在接受用户输入并以十六进制形式返回,但这只有在我一次输入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则不起作用。我无法弄清楚为什么会这样。
答案 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 :(得分: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()
函数的当前功能和返回类型感到满意的假设。