编写一个将十六进制转换为十进制的函数[重复]
Posted
技术标签:
【中文标题】编写一个将十六进制转换为十进制的函数[重复]【英文标题】:Writing a function to convert hex to decimal [duplicate] 【发布时间】:2013-11-05 11:46:29 【问题描述】:我需要编写一个将十六进制转换为十进制的函数,并且我知道如何做到这一点,但我被困在了第一位。到目前为止,我正在接受用户输入并以十六进制返回它,但这仅在我一次输入 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 则它不起作用。我不知道为什么会这样。
【问题讨论】:
如果x
等于字符串8C
,您认为您的大if ... elif
语句的哪个分支会被采用?如果你能回答这个问题,那么你就会明白为什么你的代码不起作用了。
您需要为用户输入中的每个字符调用hex()
函数;然后收集并打印结果。
【参考方案1】:
您可以使用int
来简化此操作。功能:
def hex_to_dex(strng_of_hex):
return int(strng_of_hex, 16)
例子:
>>> int("0xff", 16)
255
如果你有一个0x
infront for int 没关系,它会忽略字符串中的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()))])
我在这里使用了很多函数,但为了快速参考,这里有一个附录:
-
str.find
enumerate
reversed -> 反转字符串
sum
至于[...]
,它是一个列表解析,您可以在上面找到大量资源。
【讨论】:
不幸的是,我必须编写自己的函数来执行此操作。我将通过获取输入字符串的长度,并将第一个数字乘以 16 到长度减 1 的幂来做到这一点。 @JaAnTr Tr 最新添加。sum()
是这里的错误函数。 _hexer.find()
诡计很可爱,但结果值会很错误。
@MartijnPieters 会吗?让我再测试一下。
@GamesBrainiac: 顺便说一句,_hexer = dict(map(reversed, enumerate("0123456789ABCDEF")))
或类似的会更可爱 ;-)【参考方案2】:
目前,您正在将用户输入的整个字符串传递给您的十六进制函数。因此,它适用于“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()
函数的当前功能和返回类型感到满意,则此答案有效。
【讨论】:
"但是如果我输入 8C 那么它就不起作用了。"我正在对此进行解释。他显然对现有的功能“如果我输入 C 就可以工作”很满意 这使用了他在问题中定义的 hex()。 啊,那还是有问题,因为hex()
返回的是整数。将其转换为字符串不会产生所需的输出; C8
将导致128
,而不是200
。
@RMcG:啊,我明白了,对不起。我以为你是在为提问者的hex
函数提议一个替换!
@SteveJessop 没问题,我应该让它更明显。以上是关于编写一个将十六进制转换为十进制的函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章