编写一个将十六进制转换为十进制的函数[重复]

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 没问题,我应该让它更明显。

以上是关于编写一个将十六进制转换为十进制的函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C#将int转换为十六进制[重复]

编写一个将十进制整数转换为十六进制字符串的函数

javascript编写一个将十六进制值转换为颜色的函数

如何将十六进制字符串转换为十六进制数字 [重复]

Java将字节数组转换为十六进制字节数组[重复]

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