如何将任意碱基的字符串转换回十进制?

时间:2017-05-16 18:05:52

标签: python

我试图将十进制数转换为任意基数并返回十进制数。我在another question找到了以下代码:

def int2base(x,b,alphabet='0123456789abcdefghijklmnopqrstuvwxyz'):
    'convert an integer to its string representation in a given base'
    if b<2 or b>len(alphabet):
        if b==64: # assume base64 rather than raise error
            alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
        else:
            raise AssertionError("int2base base out of range")
    if isinstance(x,complex): # return a tuple
        return ( int2base(x.real,b,alphabet) , int2base(x.imag,b,alphabet) )
    if x<=0:
        if x==0:
            return alphabet[0]
        else:
            return  '-' + int2base(-x,b,alphabet)
    # else x is non-negative real
    rets=''
    while x>0:
        x,idx = divmod(x,b)
        rets = alphabet[idx] + rets
    return rets

当我将小数转换为十六进制时:

in_base16 = int2base(number, 16)

它有效,但当我尝试将该结果转换回十进制(基数为10)时:

back_to_10 = int2base(in_base16, 10)

...它给了我错误:

    if x<=0:
    TypeError: '<=' not supported between instances of 'str' and 'int'

由于某种原因,它无法将字符串转换回数字。我不明白为什么。我如何将一个任意数的基数转换回十进制数?

4 个答案:

答案 0 :(得分:1)

您的基本问题是签名:您的函数仅作为整数在x上起作用。相反,您需要第二个对字符串起作用的函数,或者需要在此例程顶部进行类型检查以检测输入类型。

基本问题是你假设你可以通过简单的参考获得基数(基数)内的数字值;这适用于整数,但不适用于字符串。 “9”不会产生9的数值; “B”不会给你11。

相反,您需要将字符提供给index函数并获取返回值:

digit_value = alphabet.index(char)

将为您提供字符中字符的位置,这是您计算所需的数字值。

你能从那里拿走吗?

答案 1 :(得分:1)

您的int2base函数只接受一个整数作为输入,因此您需要将字符串转换为整数。因此,您只需使用内置函数int(string, base)即可:

in_base16 = int2base(number, 16)
back_to_10 = int2base(int(in_base16, 16), 10)

哪种方法正常。

答案 2 :(得分:1)

如果base-n最多为36,则可以使用built-in int(str,base)

>>> int('AA', 32)
330

答案 3 :(得分:1)

您将需要一个函数将int转换为基数(返回代表该基数的字符串-此处直到基数36):

digits = '0123456789abcdefghijklmnopqrstuvwxyz'

def int2base(n, b=2, digits=digits):
    "convert integer n to base b"
    if n < 0:
        raise ValueError("no negative numbers")
    if n < b:
        return digits[n]
    res = []
    q = n
    while q:
        q, r = divmod(q, b)
        res.append(digits[r])
    return ''.join(reversed(res))

和另一个将基数转换回int的函数:

def base2int(s, base=2, digits=digits):
    "convert string s representing a number in base to int (base 10)"
    if not (2 <= base <= len(digits)):
        raise ValueError("base must be >= 2 and <= %d" % len(digits))
    res = 0
    for i, v in enumerate(reversed(s)):
        digit = digits.index(v)
        res += digit * (base ** i)
    return res