Python:将代码字符串转换为可逆的短无意义字符串

3 投票
3 回答
3219 浏览
提问于 2025-04-16 10:16

抱歉我问的问题有点笼统(我对压缩没有任何了解,也不知道是否有可能的解决方案)。

我有一些代码,长度总是19个字符。

这些字符只能是:A-Za-z0-9.:-

举个例子,可能是像 1995AbC...123..456Z 这样的字符串。

我想做的是找到一种方法,把这个字符串转换成一个更短的字符串,并且这个新字符串只包含ASCII字符:比如说 gfSDd2H 这样的。

  • 这可能吗?
  • 有没有办法在Python中实现?

谢谢!

3 个回答

2

当然,在Python中这是可能的。你要做的就是把一个65进制的数字转换成94或95进制的数字,然后再转换回来。只是这个过程可能会有点慢,而且正如另一个回答所提到的,你也不会节省太多空间。

这里是一些基本的构建块(未经测试):

def ttoi(text, base, letter_values):
    """converts a base-"base" string to an int"""
    n = 0
    for c in text:
        n = n * base + letter_values[c]
    return n

def itot(number, base, alphabet, padsize):
    """converts an int into a base-"base" string
       The result is left-padded to "padsize" using the zero-value character"""
    temp = []
    assert number >= 0
    while number:
        number, digit = divmod(number, base)
        temp.append(alphabet[digit])
    return max(0, padsize - len(temp)) * alphabet[0] + "".join(reversed(temp))

比如,你现有的65进制代码的定义:

b65_letter_values = {
    'A': 0, 'Z': 25, 'a': 26, 'z': 51, '0': 52, '9': 61,
    # etc
    }
b65_alphabet = "ABCetcXYZabcetcxyz0123456789.:-"
b65_padsize = 19
4

你允许使用65种不同的字符。假设所有输入的可能性是一样的,那么每种编码方式至少会产生19*65/128 ≈ 10个字符。不过,因为你可能想要忽略那些无法打印的字符,所以这个数字会减少到19*65/95=13个字符,前提是映射非常完美。因此,任何这样的映射都不会显著减少所需的空间。

5

你可以试着把字符串压缩一下,然后把结果编码成比如说base64格式。当然,这个方法是建立在你原来的字符串可以被压缩的基础上。对于19个字符的字符串,这种可能性似乎不大。

如果你可以保存一些数据的话,可以把第一个字符串压缩成1,第二个压缩成2,依此类推……你需要把这些映射关系存储在比如数据库里,以便将来可以反向查找。然后你可以把这个数字编码成base64(或者其他格式)的字符串。

这和网址缩短服务的工作原理很相似。

撰写回答