Python:将字母数字字符串可逆地编码为整数

cha*_*l-f 5 python string int encoding

我想将字符串(由字母数字字符组成)转换为整数,然后将此整数转换回字符串:

string --> int --> string

换句话说,我想用整数表示一个字母数字字符串。

我找到了一个可行的解决方案,我将其包含在答案中,但我认为这不是最佳解决方案,而且我对其他想法/方法感兴趣。

请不要仅仅因为已经存在很多类似的问题而将其标记为重复,我特别想要一种将字符串转换为整数的简单方法,反之亦然

这应该适用于包含字母数字字符的字符串,即包含数字和字母的字符串。

cha*_*l-f 6

这是我到目前为止所拥有的:

字符串 --> 字节

mBytes = m.encode("utf-8")
Run Code Online (Sandbox Code Playgroud)

字节 --> 整数

mInt = int.from_bytes(mBytes, byteorder="big")
Run Code Online (Sandbox Code Playgroud)

int --> 字节

mBytes = mInt.to_bytes(((mInt.bit_length() + 7) // 8), byteorder="big")
Run Code Online (Sandbox Code Playgroud)

字节 --> 字符串

m = mBytes.decode("utf-8")
Run Code Online (Sandbox Code Playgroud)

试试看:

m = "test123"
mBytes = m.encode("utf-8")
mInt = int.from_bytes(mBytes, byteorder="big")
mBytes2 = mInt.to_bytes(((mInt.bit_length() + 7) // 8), byteorder="big")
m2 = mBytes2.decode("utf-8")
print(m == m2)
Run Code Online (Sandbox Code Playgroud)

这是上述内容的相同可重用版本:

class BytesIntEncoder:

    @staticmethod
    def encode(b: bytes) -> int:
        return int.from_bytes(b, byteorder='big')

    @staticmethod
    def decode(i: int) -> bytes:
        return i.to_bytes(((i.bit_length() + 7) // 8), byteorder='big')
Run Code Online (Sandbox Code Playgroud)

如果您使用的是 Python <3.6,请删除可选的类型注释。

测试:

>>> s = 'Test123'
>>> b = s.encode()
>>> b
b'Test123'

>>> BytesIntEncoder.encode(b)
23755444588720691
>>> BytesIntEncoder.decode(_)
b'Test123'
>>> _.decode()
'Test123'
Run Code Online (Sandbox Code Playgroud)

  • 这很清楚又简单。而且速度很快,因为所有繁重的算术都是通过以 C 速度运行的方法执行的。 (3认同)