将数字字符串编码为缩短的字母数字字符串,然后再返回

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)


Tad*_*eck 7

有两个函数是自定义的(不是基于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变量添加其他字符,也可以缩短生成的字符串.

  • @PaulHoang:我猜你的猜测是错误的。我介绍了以类似方式工作的函数,但 1) 不需要填充(尝试从 nightcracker 的答案中删除 `=`s),2) 能够定义您自己的用于表示转换值的字符。它的工作方式与 base64 非常相似,但它不是 base64。可能有一个图书馆可以做这样的事情,但没有找到它是哪个。 (4认同)