1

我试图创建一个简单的方法来将字符串转换为以 10 为底的整数(在 Python 中):

def strToNum(strData, num=0 ,numerals="0123456789abcdefghijklmnopqrstuvwxyz"):
    return ((len(strData)==0) and num) or (strToNum(strData[0:-1], num+numerals.index(strData[-1])**len(strData)))

它似乎不起作用。当我测试 'test' 作为它输出的字符串时:729458。而当我使用一些在线工具进行转换时,我得到了:1372205.

4

3 回答 3

6

您可以int在这里简单地使用:

>>> strs = 'test'
>>> int(strs, 36)
1372205

或者定义自己的函数:

def func(strs):
    numerals = "0123456789abcdefghijklmnopqrstuvwxyz"
    return sum(numerals.index(x)*36**i for i, x in enumerate(strs[::-1]))
... 
>>> func(strs)
1372205
于 2013-07-02T12:42:52.130 回答
1

如果您的输入是 UTF-8,您可以将每个字节编码为 Base10,而不是将自己限制为某些固定的数字集。然后挑战变成了解码。一些基于 Web 的 Base10 编码器用空格分隔每个编码的字符/字节。我选择使用可以修剪的空字符左填充。

我相信这里有很大的优化空间,但这两个函数符合我的需求:

编码:

def base10Encode(inputString):
    stringAsBytes = bytes(inputString, "utf-8")
    stringAsBase10 = ""
    for byte in stringAsBytes:
        byteStr = str(byte).rjust(3, '\0') # Pad left with null to aide decoding
        stringAsBase10 += byteStr
    return stringAsBase10

解码:

def base10Decode(inputString):
    base10Blocks = []
    for i in range(0, len(inputString), 3):
        base10Blocks.append(inputString[i:i+3])
    decodedBytes = bytearray(len(base10Blocks))
    for i, block in enumerate(base10Blocks):
        blockStr = block.replace('\0', '')
        decodedBytes[i] = int(blockStr)
    return decodedBytes.decode("utf-8")
于 2022-01-23T23:31:42.927 回答
-2

尝试这个:

def convert(string: str) -> int:
    for base in range(0, 36):
        try:
            if str(int(string, base)) == string:
                return int(string, base)
                break
        except ValueError:
            pass
        finally:
            pass
于 2020-12-29T14:56:46.070 回答