将数字字符串转换为缩短的字母数字字符串,然后再转换回来

2024-09-29 00:22:23 发布

您现在位置:Python中文网/ 问答频道 /正文

快速提问。我试图用Python找到或编写一个编码器,通过使用大写和小写字母来缩短一个数字串。数字字符串如下所示:

20120425161608678259146181504021022591461815040210220120425161608667

长度总是一样的。

我最初的想法是编写一些简单的编码器,利用大小写字母和数字将字符串缩短为更像这样的内容:

a26Dkd38JK

这完全是武断的,只是想尽可能清楚。 我敢肯定有一个非常巧妙的方法来做到这一点,可能已经内置了。也许这是一个很尴尬的问题。

另外,我需要能够将缩短的字符串转换回较长的数值。 我应该写一些东西并发布代码,还是这是一个我应该已经知道的Python内置函数?

谢谢!


Tags: 方法函数字符串代码利用内容数字编码器
3条回答
>>> s="20120425161608678259146181504021022591461815040210220120425161608667"
>>> import base64, zlib
>>> base64.b64encode(zlib.compress(s))
'eJxly8ENACAMA7GVclGblv0X4434WrKFVW5CtJl1HyosrZKRf3hL5gLVZA2b'
>>> zlib.decompress(base64.b64decode(_))
'20120425161608678259146181504021022591461815040210220120425161608667'

所以zlib在压缩数字字符串方面不是很聪明

这是一个很好的压缩:

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'))

它首先将整数转换为bytestring,然后base64对其进行编码。这是解码器:

def alpha_to_num(alpha):
    num_bytes = base64.b64decode(alpha)
    return int(num_bytes.encode('hex'), 16)

示例:

>>> num_to_alpha(20120425161608678259146181504021022591461815040210220120425161608667)
'vw4LUVm4Ea3fMnoTkHzNOlP6Z7eUAkHNdZjN2w=='
>>> alpha_to_num('vw4LUVm4Ea3fMnoTkHzNOlP6Z7eUAkHNdZjN2w==')
20120425161608678259146181504021022591461815040210220120425161608667

有两个函数是自定义的(不是基于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

结果是:

>>> int_to_cust(20120425161608678259146181504021022591461815040210220120425161608667)
'9F9mFGkji7k6QFRACqLwuonnoj9SqPrs3G3fRx'
>>> cust_to_int('9F9mFGkji7k6QFRACqLwuonnoj9SqPrs3G3fRx')
20120425161608678259146181504021022591461815040210220120425161608667L

如果向chrs变量添加其他字符,也可以缩短生成的字符串。

相关问题 更多 >