字符集:
table = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"
方法一: 求余和整除的方式
def b64(n: int) -> str:
if n == 0:
return "0"
r = []
while n > 0:
r.append(table[n % 64])
n //= 64
return "".join(r[::-1])
print(b64(100)) # 1A
方法二: 先转二进制, 再转成64进制
def p64(n: int) -> str:
s = bin(n)[2:][::-1]
return "".join([table[int(s[i : i + 6][::-1], 2)] for i in range(0, len(s), 6)][::-1])
print(p64(100)) # 1A
64进制转10进制:
T_MAP = {s: i for i, s in enumerate(table)}
def d64(s: str, *, t_map: Dict[str, int] = T_MAP) -> int:
i = 0
for c in s:
i = i * 64 + t_map[c]
return i
聚合成类方法:
class DigitGame:
chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"
t_map = {s: i for i, s in enumerate(chars)}
@classmethod
def hex_compress(cls, s: str) -> str:
"""十六进制转64进制
Usage::
>>> DigitGame.hex_compress('aef01ABCDE')
'aXM6HPu'
"""
return cls.b64(int(s, 16))
@classmethod
def hex_decompress(cls, s: str, upper=True) -> str:
"""64进制转十六进制
Usage::
>>> DigitGame.hex_decompress('aXM6HPu')
'AEF01ABCDE'
"""
t = hex(cls.d64(s))[2:]
if upper:
t = t.upper()
return t
@classmethod
def b64(cls, n: int) -> str:
"""十进制转64进制
Usage::
>>> DigitGame.b64(1000)
'fE'
"""
s = bin(n)[2:][::-1]
return "".join(
[cls.chars[int(s[i : i + 6][::-1], 2)] for i in range(0, len(s), 6)][::-1]
)
@classmethod
def b64_readable(cls, n: int) -> str:
"""十进制转64进制
Usage::
>>> DigitGame.b64_readable(1000)
'fE'
"""
if n == 0:
return "0"
r = []
while n > 0:
r.append(cls.chars[n % 64])
n //= 64
return "".join(r[::-1])
@classmethod
def d64(cls, s: str) -> int:
"""64进制转十进制
Usage::
>>> DigitGame.d64('fE')
1000
"""
i = 0
for c in s:
i = i * 64 + cls.t_map[c]
return i