2012-05-03 88 views
0

我有100M元素的BitArray。這是大約12.5M。 我必須壓縮這個數組。我使用框架的GZipStream。使用GZip壓縮BitArray在C#

public static byte[] Compress(byte[] bytData) 
    { 
     try 
     { 
      MemoryStream ms = new MemoryStream(); 
      Stream s = new GZipStream(ms, CompressionMode.Compress); 
      s.Write(bytData, 0, bytData.Length); 
      s.Close(); 
      byte[] compressedData = ms.ToArray(); 
      return compressedData; 
     } 
     catch 
     { 
      return null; 
     } 
    } 

    static void Main(string[] args) 
    { 
     BitArray t = GetArray(); 
     byte []byteArray = new byte[100000000/8]; 
     t.CopyTo(byteArray, 0); 
     byte[] compressedData = Compress(byteArray); 
     Console.WriteLine(compressedData.Length); 
    } 
    public static BitArray GetArray() 
    { 
     Random r = new Random(); 
     BitArray result = new BitArray(100000000); 
     for (int i = 0; i < result.Count; i++) 
     { 
      if (r.NextDouble() > .5) 
      { 
       result.Set(i, true); 
      } 
     } 
     return result; 
    } 
} 

但變量compressedData的大小是12515308. 這是更大然後原來的數組。 任何想法?

可能需要我另一臺壓縮機嗎?

+3

壓縮通過將短碼分配給數據中的常用序列和將長碼分配給稀有序列來工作。如果數據是完全隨機的,那麼頻繁發生的序列就不會很多,所以結果可能會比原始結果更長。解決方案:不要壓縮隨機數據。或者如果必須,只需使用PRNG(如Random)並僅存儲種子而不是生成的值(「程序生成」)。 – dtb

+0

Thx。 我需要使用隨機數據。 我無法使用GZip。 可能是另一臺壓縮機。 這不完全是隨機數字,但fop POC我使用隨機數。 這就像用戶的加密代碼。它必須是隨機的。 – Leonid

+0

加密後壓縮通常是一個糟糕的主意(您會產生壓縮開銷,並且由於@dtb提到的原因,實際大小會減少)。如果可能的話,嘗試在數據加密之前壓縮數據,這就是當你獲得最佳結果的時候。 – carlosfigueira

回答

1

你有沒有試過不使用隨機數據?壓縮好的數據不是隨機的。我相信普通的壓縮算法會尋找比特模式來壓縮。作爲一個簡單的測試,您可以將這些隨機字節寫入文件中,然後查看壓縮文件時會發生什麼。

0

沒有壓縮機可以壓縮真正的隨機數據。 (正如已經指出的那樣,如果可以推導出種子和算法,則可以壓縮僞隨機數據。)

你的應用程序是什麼?你有真實的數據來測試它嗎?

+0

呵呵呵如何將64KB的僞隨機數壓縮成4個字節:[SEED,STREAM_LENGTH]? :) – JSideris