我想要压缩一堆长字符串(16200个字符)。整个字符串只使用12个不同的字符(目前为_oOwWgGmdDsS,但如果需要,可以更改)。
我想要压缩这个字符串。我现在自己做了一个压缩方案,每次我第一次放置角色,然后在另一个角色出现之前出现多少次。因此,如果未压缩的文本如下所示:
ooooooWW_
然后压缩变为
o6W2_1
对于我目前使用的字符串,这个大小从大约128MB减少到4MB。但是,正如你所看到的那样,对于W来说,没有任何豁免,而且对于_甚至是一种损失。
所以我想知道,我可以使用更复杂的压缩方案吗?最终结果必须是纯文本,而不是二进制数据。
注意:如果Python和Lua都有一个库,它也会很棒。
答案 0 :(得分:1)
使用zlib压缩为二进制,然后使用base64将二进制文件扩展为纯文本。 Python内置了。有点谷歌搜索将为zlib和base64代码打开Lua绑定。
答案 1 :(得分:0)
这个问题似乎是一个隐含地询问什么是压缩及其工作原理的问题。 Mark 的答案适用于更长的字符串,但我也建议您阅读 this guide on what zlib actually does。
在 iPython3 中运行 Mark 的代码(编辑以解压缩压缩文本):
In [1]: import zlib
...: import base64
...: text = input('Text to compress > ')
...: compressed = base64.b64encode(zlib.compress(text.encode())).decode()
...: print('Compressed Text:', compressed)
...: decompressed = zlib.decompress(base64.b64decode(compressed)).decode()
...: print('Decompressed Text:', decompressed)
Text to compress > some text I wrote
Compressed Text: eJwrzs9NVShJrShR8FQoL8ovSQUAOSwGVA==
Decompressed Text: some text I wrote
您可以看到“压缩”的文本实际上大约是这个小示例的输入字符数的两倍。更长的示例输入(比如 200 个字符)开始显示出好处。
这是因为base64 encoding:
<块引用>[...] 导致 33–36% 的开销(编码本身为 33%;插入的换行符最多增加 3%)。
因此,您需要比开销更有效地预先压缩数据才能看到任何好处。同时,作为 Mark points out in this answer 很难独立于数据预测 zlib 会给你什么压缩率。