2010-11-25 88 views
0

我创建了以下用于字符串压缩的Internet上的代码。当我压缩一个简单的字符串时,返回值是非常不同的。字符串压缩结果作为字符串

例如,压缩( “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

你的问题是什么? – LukeH 2010-11-25 16:34:33

回答

0

准则旨在为压缩真正的大串。它使用GZip压缩算法压缩源字符串,然后通过使用BASE64编码使其可读(或可用/“可通过”)。

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

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

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

+0

例如,当我压缩像这样的“3F2504E0-4F89-11D3-9A0C-0305E82C3301”的Guid值时,期望的返回值是“7QDBkvCA1 + B9K/U0vrQx1A--”。但是压缩方法返回“H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1 + B0oQiAYBMk2JBAEOzBiM3mkuwda ...”如何取“7QDBkvCA1 + B9K/U0vrQx1A--”值? – user517601 2010-11-25 16:39:06

0

肯定的意思,因为结果是用base64(请参阅您的代码的最后一行)。

0

压缩并不总是导致的几个原因较小的输出:

  1. 输入可能是完全随机的,在这种情况下,大多数的压缩将不会执行压缩操作,但仍需要保存减压“说明”。压缩这些数据的结果是数据+指令...更大。
  2. 输入没有使用所使用的压缩算法搜索的功能。这与前一个例子非常相似,只是它取决于所使用的压缩算法(在您的情况下为Gzip)。
  3. 非常小的输入。输入越小,在其中找到可压缩段的机会就越小,因此您很有可能会得到伪随机输入(不是随机的,但它看起来很随机),我们又回到第一个案例。

Base64在这里是一个很大的问题,是的,但只是不要忘记关于压缩的一些小的事实。