C#压缩一串字符

时间:2011-07-13 16:51:02

标签: c# string compression

假设1个字符是1字节,所以我有10个字符,那是10Bytes。

我有一个包含20个字符的句子,我需要将这个句子上传到服务器。并且限制只有10个字节,我如何压缩这个20Bytes到10Bytes的句子。

无论如何我可以通过C#做到这一点吗?

修改

我有一个170个字符的句子,我需要以一种看起来像130个字符的方式压缩它。我正在将这句话上传到第三方服务器,所以我对服务器没有任何控制权。可以这样做吗?

5 个答案:

答案 0 :(得分:2)

嗯,你不能以保证的方式做到这一点,不。有比20个字节序列更多的20字节序列 - 所以你不可能将每个 20字节的序列可逆地压缩成10个字节。

通常,在非常小的输入长度下,压缩通常不能很好地工作。

如果你知道你的所有输入实际是(比方说)A-Z和空格(即27个字符)那么那就是5比特......所以你总共需要100比特。这仍然比你可用的80位多一点,所以你仍然无法保证代表所有句子。你可以让“普通”字符比“不寻常”字符更短,并且可以通过这种方式获得许多句子。

鉴于原始要求的不可能性,在不知道真正需要实现什么的情况下,很难更具体。

答案 1 :(得分:1)

你不能,压缩比取决于字符串本身的内容。 即使您可以压缩序列,也必须在服务器上实现解压缩。但是,如果您可以访问服务器,则可以简单地将序列分成许多部分。

答案 2 :(得分:1)

你这里有一个严重的问题。二十个字节是160位是2 ^ 160个可能的消息。十个字节是80位是2 ^ 80个可能的消息。除非您有某种方法可以将源消息空间减少到仅包含2 ^ 80条可能的消息,否则您无法执行此操作。

答案 3 :(得分:1)

你想要的大部分时间都应该是可能的,但我可以保证你的问题。如果您使用GZipStream类编写了一个方法,则可以使用这个170字节的字符串并减少它。像大多数人所说的那样,压缩比实际上取决于内容本身。

就像测试一样: 我拿了一串“0123456789”重复了17次(170个字符),然后将其缩小为21个字符。
如果我取一个170个零的字符串并对其进行gzip,它会减少到12个字符。 我使用了170个字节的随机代码,它减少到79个字符。

因此,在这些情况下,它会压缩它以适应您的空间要求;但没有办法预测它何时以及多久不会。压缩比可能最终为1:1,并且在创建块结构时存在固有的开销,因此实际上可能导致压缩长度略大于原始压缩长度。然后,你可能需要对整个事物进行base64编码,使其在数据库中正确存储,这样会增加你的开销。

答案 4 :(得分:0)

如果消息是静态的,则将索引传递给包含可能发送的不同消息的数组,而不是传递消息。如果它们是动态的,那么根本不可能,除非您可以将自己限制为ASCII的有限子集并在一个字节中存储多个字符,或者字符串极其重复,在这种情况下您可以考虑Run-Length Encoding