如何在C#中压缩长字符串时获取短字符串。
我想将一个长字符串压缩成一个短字符串(最小长度),并且还要将其解压缩以取回原始字符串。使用最小长度意味着如果原始字符串长度为10,则压缩字符串长度必须是原始字符串长度的一半或更少。
我不想使用除.Net内置的库以外的任何库。
For example: Original String: "Hello World"
Compressed String: "$n(@3" //something like this.
我使用不同的方法,但他们不会以这种方式压缩。任何帮助? 提前致谢。
答案 0 :(得分:5)
任意保证压缩是不可能的(例如参见http://matt.might.net/articles/why-infinite-or-guaranteed-file-compression-is-impossible/)。
答案 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)
您可以使用GZipStream:
http://www.codeproject.com/KB/files/GZipStream.aspx
http://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream.aspx
答案 4 :(得分:0)
根据您的评论,我了解您希望保存数据库大小。
压缩10个字符的字符串,对你没有多大帮助。并且不保证赢得一定比例(你不能压缩已压缩的字符串)。
您可以将每个字符串存储在一个表中(使用字符串和数字主键),并仅使用其他表中的键引用该字符串。如果你有重复的字符串。如果您的字符串不重复,您可以将每个字符串分解为单词,并存储单词的索引。
答案 5 :(得分:-3)
我建议魔法。字符串只是一系列数字,其中没有一个可以丢弃并保持字符串相同。因此,要压缩字符串,您需要确定是否有任何字符串可以不用,并制定规则来执行此操作。我想不出任何常见的方法,所以你必须制定自己的规则。