压缩/解压缩字符串后如何获取短字符串?

时间:2011-02-07 13:50:05

标签: c# .net compression

如何在C#中压缩长字符串时获取短字符串。

我想将一个长字符串压缩成一个短字符串(最小长度),并且还要将其解压缩以取回原始字符串。使用最小长度意味着如果原始字符串长度为10,则压缩字符串长度必须是原始字符串长度的一半或更少。

我不想使用除.Net内置的库以外的任何库。

For example: Original String: "Hello World" 
Compressed String: "$n(@3" //something like this.

我使用不同的方法,但他们不会以这种方式压缩。任何帮助? 提前致谢。

6 个答案:

答案 0 :(得分:5)

答案 1 :(得分:3)

使用自2.0开始的GZipStream

private static string CompressLongString(string longString)
{
    MemoryStream outstream = new MemoryStream();
    MemoryStream instream = new MemoryStream(Encoding.UTF8.GetBytes(longString));

    using (GZipStream compress = 
        new GZipStream(outstream, 
        CompressionMode.Compress))
    {
        instream.CopyTo(compress);

    }

    return Encoding.Unicode.GetString(outstream.GetBuffer());
}

答案 2 :(得分:1)

你真正的问题是什么?如果要通过压缩很长的字符串来节省内存,则可以将其转换为UTF-8中的byte[]数组。创建一个MemoryStream对象,然后在StreamWriter上以UTF-8创建MemoryStream并将字符串写入其中。然后关闭streamwriter并流并使用ToArray()将其转换为紧凑数组。虽然这会创建许多临时对象,但生成的数组通常比原始字符串小得多。

请注意,这不是压缩,只是将字符编码为UTF-8,通常比字符串中通常使用的UTF-16小50%。它是根据您的要求使用标准.NET库完成的。 (但结果并不是你想要的字符串。)

答案 3 :(得分:0)

答案 4 :(得分:0)

根据您的评论,我了解您希望保存数据库大小。

压缩10个字符的字符串,对你没有多大帮助。并且不保证赢得一定比例(你不能压缩已压缩的字符串)。

您可以将每个字符串存储在一个表中(使用字符串和数字主键),并仅使用其他表中的键引用该字符串。如果你有重复的字符串。如果您的字符串不重复,您可以将每个字符串分解为单词,并存储单词的索引。

答案 5 :(得分:-3)

我建议魔法。字符串只是一系列数字,其中没有一个可以丢弃并保持字符串相同。因此,要压缩字符串,您需要确定是否有任何字符串可以不用,并制定规则来执行此操作。我想不出任何常见的方法,所以你必须制定自己的规则。