2011-02-07 144 views
-1

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

我想压缩一个很长的字符串成一个短的字符串(最小长度),也想解压缩回来我的原始字符串。最小长度表示如果原始字符串长度为10,则压缩字符串长度必须是原始字符串的一半或更少。

我不想使用库中构建的.Net以外的任何库。

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

我用不同的方法,但他们并不在此manner.Any帮助压缩? 在此先感谢。

+1

那么,你想要什么语言的答案?您发布了3种语言和一个平台。另外,你的问题定义对于给出的有用答案太模糊了(例如 - “最小长度” - 最小长度)? – Oded 2011-02-07 13:51:15

+0

任何像C++,C#.Net和VB.Net.I语言都可以将它转换成我的C#。使用最小长度表示如果原始字符串长度为10,则压缩字符串长度必须是原始的一半或更少。 – mirfan00 2011-02-07 13:53:23

+0

很可能你会在这样一个压缩的字符串中得到不可打印的字符,甚至非unicode符号。你究竟想要在这里解决什么问题,为什么你需要将它们压缩成新的*字符串*? – 2011-02-07 13:55:54

回答

3

使用GZipStream这是自2.0以来的.NET。

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()); 
} 
-4

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

1

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

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

0

从您的意见我明白你想保存数据库的大小。

压缩10个字符的字符串,并不会让你感到非常满意。并没有保证赢得一定的比例(你不能压缩已经压缩的字符串)。

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