我有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. 這是更大然後原來的數組。 任何想法?
可能需要我另一臺壓縮機嗎?
壓縮通過將短碼分配給數據中的常用序列和將長碼分配給稀有序列來工作。如果數據是完全隨機的,那麼頻繁發生的序列就不會很多,所以結果可能會比原始結果更長。解決方案:不要壓縮隨機數據。或者如果必須,只需使用PRNG(如Random)並僅存儲種子而不是生成的值(「程序生成」)。 – dtb
Thx。 我需要使用隨機數據。 我無法使用GZip。 可能是另一臺壓縮機。 這不完全是隨機數字,但fop POC我使用隨機數。 這就像用戶的加密代碼。它必須是隨機的。 – Leonid
加密後壓縮通常是一個糟糕的主意(您會產生壓縮開銷,並且由於@dtb提到的原因,實際大小會減少)。如果可能的話,嘗試在數據加密之前壓縮數據,這就是當你獲得最佳結果的時候。 – carlosfigueira