2010-11-25 55 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在這裏是一個很大的問題,是的,但只是不要忘記關於壓縮的一些小的事實。