Rya*_*tin 7 python string encode numeric
快问.我试图在Python中查找或编写一个编码器,通过使用大写和小写字母缩短一串数字.数字字符串看起来像这样:
20120425161608678259146181504021022591461815040210220120425161608667
Run Code Online (Sandbox Code Playgroud)
长度总是一样的.
我最初的想法是编写一些简单的编码器来利用大写和小写字母和数字来缩短这个字符串,看起来更像是这样:
a26Dkd38JK
Run Code Online (Sandbox Code Playgroud)
这完全是武断的,只是想尽可能清楚.我确信有一种非常光滑的方式可以做到这一点,可能已经内置.也许这是一个令人尴尬的问题甚至要问.
此外,我需要能够采取缩短的字符串并将其转换回更长的数值.我应该写一些东西并发布代码,还是我应该已经知道的这是一个用Python函数构建的一行?
谢谢!
orl*_*rlp 10
这是一个非常好的压缩:
import base64
def num_to_alpha(num):
num = hex(num)[2:].rstrip("L")
if len(num) % 2:
num = "0" + num
return base64.b64encode(num.decode('hex'))
Run Code Online (Sandbox Code Playgroud)
它首先将整数转换为字节串,然后base64对其进行编码.这是解码器:
def alpha_to_num(alpha):
num_bytes = base64.b64decode(alpha)
return int(num_bytes.encode('hex'), 16)
Run Code Online (Sandbox Code Playgroud)
例:
>>> num_to_alpha(20120425161608678259146181504021022591461815040210220120425161608667)
'vw4LUVm4Ea3fMnoTkHzNOlP6Z7eUAkHNdZjN2w=='
>>> alpha_to_num('vw4LUVm4Ea3fMnoTkHzNOlP6Z7eUAkHNdZjN2w==')
20120425161608678259146181504021022591461815040210220120425161608667
Run Code Online (Sandbox Code Playgroud)
有两个函数是自定义的(不是基于base64),但产生更短的输出:
chrs = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
l = len(chrs)
def int_to_cust(i):
result = ''
while i:
result = chrs[i % l] + result
i = i // l
if not result:
result = chrs[0]
return result
def cust_to_int(s):
result = 0
for char in s:
result = result * l + chrs.find(char)
return result
Run Code Online (Sandbox Code Playgroud)
结果是:
>>> int_to_cust(20120425161608678259146181504021022591461815040210220120425161608667)
'9F9mFGkji7k6QFRACqLwuonnoj9SqPrs3G3fRx'
>>> cust_to_int('9F9mFGkji7k6QFRACqLwuonnoj9SqPrs3G3fRx')
20120425161608678259146181504021022591461815040210220120425161608667L
Run Code Online (Sandbox Code Playgroud)
如果向chrs变量添加其他字符,也可以缩短生成的字符串.