编码数字字符串转换为缩短的字母数字字符串,然后再返回(Encoding a numeric stri

2019-07-29 03:37发布

快速的问题。 我试图找到或编写Python中的编码器通过使用大写和小写字母,缩短了一串号码。 该数字串是这个样子:

20120425161608678259146181504021022591461815040210220120425161608667

长度始终是相同的。

我最初的想法是写一些简单的编码器使用大小写字母和数字来缩短这个字符串到的东西,看起来更像是这样的:

a26Dkd38JK

这是完全是随意的,只是想尽可能明确。 我敢肯定,没有做到这一点,可能已经建立在一个真正漂亮的方法。也许这是一个令人尴尬的问题,甚至会问。

另外,我需要能够采取缩短字符串,并将其转换回长数值。 我应该写的东西和职位的代码,或者这是建立在Python的功能,我应该已经了解一个行?

谢谢!

Answer 1:

这是一个相当不错的压缩:

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

它首先,接通整数为字节串,然后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


Answer 2:

有两个功能,这些功能的自定义(不是基于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变量。



Answer 3:

>>> s="20120425161608678259146181504021022591461815040210220120425161608667"
>>> import base64, zlib
>>> base64.b64encode(zlib.compress(s))
'eJxly8ENACAMA7GVclGblv0X4434WrKFVW5CtJl1HyosrZKRf3hL5gLVZA2b'
>>> zlib.decompress(base64.b64decode(_))
'20120425161608678259146181504021022591461815040210220120425161608667'

所以zlib的是不压缩的数字串真正的智能:(



文章来源: Encoding a numeric string into a shortened alphanumeric string, and back again