C# 压缩小字符串

C# 压缩小字符串,c#,string,compression,C#,String,Compression,也许有什么方法可以将小字符串(86个字符)压缩成更小的字符串 @a@1\s\215\c\6\-0.55955,-0.766462,0.315342\s\1\x\-3421.-4006,3519.-4994,3847.1744,sbs 我看到的唯一方法是替换唯一字符上的重复字符。 但我在谷歌上找不到这方面的信息。 谢谢您的回复。 哈夫曼编码可能是一个不错的开始。一般来说,这个想法是用复制原始字符串或数据集所需的最小位模式替换单个字符 您将需要对各种“小字符串”进行统计分析,以找到最常见的字符,以

也许有什么方法可以将小字符串(86个字符)压缩成更小的字符串

@a@1\s\215\c\6\-0.55955,-0.766462,0.315342\s\1\x\-3421.-4006,3519.-4994,3847.1744,sbs
我看到的唯一方法是替换唯一字符上的重复字符。 但我在谷歌上找不到这方面的信息。 谢谢您的回复。

哈夫曼编码可能是一个不错的开始。一般来说,这个想法是用复制原始字符串或数据集所需的最小位模式替换单个字符


您将需要对各种“小字符串”进行统计分析,以找到最常见的字符,以便使用最小的唯一位模式来表示更常见的字符。并可能用需要表示的每个字符(如a-z0)组成一个“示例”小字符串-9@.0-)

您应该查找
运行长度编码。
下面是一个演示

rrrrrunnnnnn    BECOMES    5r1u6n     WHAT? truncate repetitions: for x consecutive r use xr
如果有些字符是数字呢?然后使用ASCII值为x的字符,而不是使用x。例如 如果您有43个连续的P,请写入
+P
,因为“+”有ASCII代码43。如果您有49个连续y,请写入
1y
,因为“1”具有ASCII代码49

现在的问题是,如果你有一个重复很少或没有重复的字符串,那么所有压缩算法都会遇到。那么在这种情况下,您的代码可能比原始单词长。但所有压缩算法都是如此

注:


我不鼓励使用哈夫曼编码,因为即使您使用Ziv-Lempel实现,仍然需要做大量的工作才能使其正确。

我以85字节的字符串为例(不是83字节,因为它是从文章中逐字复制的,可能有一些预期的转义未被处理)。我使用原始的deflate压缩了它,即没有zlib或gzip头和尾,它压缩到69字节。这主要是通过哈夫曼编码完成的,不过也使用了四个三字节向后的字符串引用

压缩这类数据的最好方法是使用您所知道的关于数据的所有信息。它似乎有某种结构,里面有编码的数字。您可以开发更短的预期数据表示形式。您可以将其编码为一个比特流,第一个比特可以指示在您获得的数据不是预期的情况下,接下来的是直字节


另一种方法是利用以前的信息。如果此消息是消息流中的一条,并且它们看起来彼此相似,那么您可以制作一个先前消息的字典,用作压缩的基础,该字典可以在另一端由接收到的先前消息重建。如果它们的消息真的很相似,那么这可能会大大提高压缩效果。

这里有一个想法:没有通用的方法可以做到这一点。如果您的字符只能具有特定的值,那么像base-64编码之类的东西可能会有所帮助。基于熵的系统(如Huffman)或基于字典的系统(如LZW)不能保证单个字符串的大小减少。字符集的范围(以ascii码表示)是否小于128?例如,如果您仅使用代码32至140。然后您可以用..的可能副本表示每个字符。。而且:哈夫曼编码是这家伙想要做的事情的杀手。正如您所提到的,他需要知道该技术有意义的相对概率。这并不完全正确,它仍然可以提供相当好的压缩,因为仅使用这些字符串所代表的所需且相对较小的字符集,就可以将ASCII压缩到较小的位空间。除非与数据有很强的统计关系,否则它不会是“最优”的。