2014-10-22 117 views
-1

我使用下面的代碼來壓縮字符串,但字符串不會更短。你能解釋爲什麼嗎?使用GZip壓縮字符串,字符串不會更短

private string Compress(string str) 
     { 
      try 
      { 
       String returnValue; 
       byte[] buffer = Encoding.ASCII.GetBytes(str); 
       using (MemoryStream ms = new MemoryStream()) 
       { 
        using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true)) 
        { 
         zip.Write(buffer, 0, buffer.Length); 
         using (StreamReader sReader = new StreamReader(ms, Encoding.ASCII)) 
         { 
          returnValue = sReader.ReadToEnd(); 
         } 
        } 

       } 
       return returnValue;     
      } 
      catch 
      { 
       return str; 
      } 
     } 
+2

什麼是輸入,輸出是什麼?你有沒有機會登陸釣魚區?你調試了嗎? – nvoigt 2014-10-22 11:32:10

+1

您是否嘗試刪除'catch'塊以查看您的代碼是否在默默無聞?一般來說,絕對不要寫'catch {}' - 即使'catch(Exception ex){log(ex)}'稍微好一點,儘管通常仍然過於寬泛。 – 2014-10-22 11:32:24

+1

爲什麼你將內存流(二進制)的內容讀回來,就好像它是ASCII字符串一樣?這將使產量超出恢復範圍。 – 2014-10-22 11:32:59

回答

1

忽略代碼中的問題 - 發生這種情況時有多種可能的情況。

壓縮算法的簡化解釋 - 壓縮是基於這樣一個事實,即您試圖壓縮的數據包含冗餘值 - 可以通過壓縮算法識別的模式,並且可以通過更簡潔地表達冗餘值來「縮短」。

某些方案當壓縮結果可以更大則輸入:

1)輸入過短 - 壓縮算法具有一些數據開銷,並考慮到短的輸入,它是無法有效地進行壓縮。所以你有一些來自壓縮機制+原始數據的數據開銷。

2)輸入已經被壓縮 - 同樣,壓縮算法有一些數據開銷,輸入什麼時候已經壓縮 - 它無法有效地進行壓縮。 3)輸入過於隨機 - 考慮到輸入是由一些隨機生成器生成的,壓縮算法無法有效地壓縮它 - 無法識別模式。