将简单文本压缩为文本

时间:2016-12-14 17:18:25

标签: compression

我想要压缩一堆长字符串(16200个字符)。整个字符串只使用12个不同的字符(目前为_oOwWgGmdDsS,但如果需要,可以更改)。

我想要压缩这个字符串。我现在自己做了一个压缩方案,每次我第一次放置角色,然后在另一个角色出现之前出现多少次。因此,如果未压缩的文本如下所示:

ooooooWW_

然后压缩变为

o6W2_1

对于我目前使用的字符串,这个大小从大约128MB减少到4MB。但是,正如你所看到的那样,对于W来说,没有任何豁免,而且对于_甚至是一种损失。

所以我想知道,我可以使用更复杂的压缩方案吗?最终结果必须是纯文本,而不是二进制数据。

注意:如果Python和Lua都有一个库,它也会很棒。

2 个答案:

答案 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 会给你什么压缩率。