字符串压缩结果为字符串

时间:2010-11-25 16:28:44

标签: c# compression

我在互联网上创建了以下代码来进行字符串压缩。当我压缩一个简单的字符串时,返回值是非常不同的。

例如,压缩( “ABC”)返回 “AwAAAB + LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee ++ 997o7nU4n99 // P1xmZAFs9s5K2smeIYCqyB8 / fnwfPyKyyfT / AcJBJDUDAAAA”

我可以采用简单的字符串结果。

由于

using System.IO.Compression;
using System.Text;
using System.IO;

public static string Compress(string text)
{
byte[] buffer = Encoding.UTF8.GetBytes(text);
MemoryStream ms = new MemoryStream();
using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))
{
zip.Write(buffer, 0, buffer.Length);
}

ms.Position = 0;
MemoryStream outStream = new MemoryStream();

byte[] compressed = new byte[ms.Length];
ms.Read(compressed, 0, compressed.Length);

byte[] gzBuffer = new byte[compressed.Length + 4];
System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
return Convert.ToBase64String (gzBuffer);
}

3 个答案:

答案 0 :(得分:0)

您正在使用的代码用于压缩非常大的字符串。它使用GZip压缩算法压缩源字符串,然后使用BASE64编码使其可读(或可用/“可通过”)。

Base64将源字符串扩展到~1.33倍(8位符号编码为6位+ 2位溢出,用于下一个符号)。所以要理解字符串必须从源长度压缩至少70%。

使用该编码时,结果是预期的和通常的。

  

要回答您的问题,请通过“简单字符串结果”

定义您的意思

答案 1 :(得分:0)

当然,因为结果是在base64中(请参阅代码中的最后一行)。

答案 2 :(得分:0)

由于以下几个原因,压缩并不总是导致较小的输出:

  1. 输入可能是完全随机的,在这种情况下,大多数压缩都不会压缩任何内容,但仍需要保存解压缩“指令”。压缩这些数据的结果是数据+指令......更大。
  2. 输入没有使用压缩算法搜索的功能。这是与前一个非常类似的情况,除了它取决于使用的压缩算法(在你的情况下是Gzip)。
  3. 非常小的输入。输入越小,在其中找到可压缩段的机会越少,因此很有可能获得伪随机输入(不是随机的,但是它看起来很随机),我们再次回到第一种情况
  4. Base64在这里是一个重点,是的,但是不要忘记这些关于压缩的小事实。