我正在寻找一种将某些字符串压缩到另一个字符串的算法(即没有“\ 0”或特殊控制字符),但我在互联网上找不到任何东西。有这样的算法吗?它不一定非常有效,只需要基本的东西。
答案 0 :(得分:7)
易:
$ echo "Hello world" | gzip -c | base64
H4sIALnHeU4AA/NIzcnJVyjPL8pJ4QIA1eA5twwAAAA=
$ echo "H4sIALnHeU4AA/NIzcnJVyjPL8pJ4QIA1eA5twwAAAA=" | base64 -d | gzip -dc
Hello world
注意:看起来没有压缩,但对于更大的数据,压缩率会更好: - )
答案 1 :(得分:3)
显然你有一些特定的字符集,你想将它用于原始字符串和压缩字符串。
标准压缩例程(例如gzip)处理字节字符串。
一个想法是使用现有代码(例如gzip)并重写它以使用您的字符集 而不是字节。
另一种方法是在字符集中的字符串和任意字节字符串之间构建一对一映射,将原始字符串映射到字节字符串,使用标准压缩实用程序或函数压缩字节字符串,并映射结果使用您的字符集返回字符串。 (严格来说,您可以使用两种不同的映射。)
构建映射的一种方法是用假人和特殊填充字符填充你的字符集,直到你有2 ^ k个不同的字符(对于某些k);然后每8个字符对应k个字节(较短的字符串可以用填充字符填充)。
答案 2 :(得分:3)
您对没有“特殊字符”的要求非常严格,除非您可以保证字符的子集(例如“〜”)将从不使用。然后,您可以使用这些字符标记压缩:
~a - >该
~b - >该
~c - >和
~d - >和
~e - > Sirius Robotics Corporation Ltd.
等。
只需将常用字词添加到码本即可。如上所述,码本可以是固定的,或者随着要压缩的文本而变化。无论哪种方式,解压缩方都需要访问正确的码本来进行解压缩。
答案 3 :(得分:1)
据我所知,最流行的压缩算法允许重复使用标准C字符串处理例程来处理压缩文本(即,小心避免在压缩字符串中放入任何0x00字节,除非结束-of-compressed-data marker)是simple byte-pair encoding,也称为dual-tile encoding或DTE。 DTE通常用于压缩视频游戏ROM中的文本。
当DTE解压缩器打印出DTE压缩字符串时,它从DTE压缩字符串一次读取1个字节并打印出1或2个字节:
典型的DTE实现在编码器和解码器中都存储了硬连线字典,如下所示: