C# 在C中用GZip压缩位数组#
我有一个100M元素的比特阵列,大约是12.5M。 我必须压缩这个数组。我使用框架的GZipStreamC# 在C中用GZip压缩位数组#,c#,gzip,gzipstream,C#,Gzip,Gzipstream,我有一个100M元素的比特阵列,大约是12.5M。 我必须压缩这个数组。我使用框架的GZipStream public static byte[] Compress(byte[] bytData) { try { MemoryStream ms = new MemoryStream(); Stream s = new GZipStream(ms, CompressionMode.Compress);
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;
}
}
公共静态字节[]压缩(字节[]bytData)
{
尝试
{
MemoryStream ms=新的MemoryStream();
流s=新的gzip流(ms,CompressionMode.Compress);
s、 写入(bytData,0,bytData.Length);
s、 Close();
字节[]压缩数据=ms.ToArray();
返回压缩数据;
}
抓住
{
返回null;
}
}
静态void Main(字符串[]参数)
{
BitArray t=GetArray();
字节[]字节数组=新字节[100000000/8];
t、 CopyTo(byteArray,0);
字节[]压缩数据=压缩(字节数组);
控制台写入线(压缩数据长度);
}
公共静态位数组GetArray()
{
随机r=新随机();
BitArray结果=新的BitArray(100000000);
for(int i=0;i.5)
{
结果集(i,真);
}
}
返回结果;
}
}
但是可变压缩数据的大小是12515308。
它比原始阵列大。
有什么想法吗
可能需要另一台压缩机吗?您是否尝试过不使用随机数据?压缩良好的数据不是随机的。我相信常用的压缩算法会寻找位的模式来进行压缩。作为一个简单的测试,您可以将这些随机字节写入一个文件,然后查看压缩时会发生什么。没有压缩器可以压缩真正的随机数据。(如前所述,如果可以推断种子和算法,就可以压缩伪随机数据。)
你的申请是什么?你有真实的数据来测试吗?压缩的工作原理是将短代码分配给数据中的普通序列,将长代码分配给稀有序列。如果数据是完全随机的,那么频繁出现的序列就不多了,因此结果可能会比原始结果更长。解决方案:不要压缩随机数据。或者,如果必须,只需使用PRNG(如Random)并仅存储种子而不是生成的值(“程序生成”).Thx。我需要使用随机数据。我不能使用GZip。可能是另一台压缩机。这不完全是随机数,但fop POC我使用随机数。这就像用户的加密代码。它必须是随机的。加密后压缩通常是一个坏主意(您会产生压缩开销,并且由于@dtb提到的原因,实际大小会减少到最小(如果有的话)。如果可能的话,试着在数据加密之前对其进行压缩,这样会得到最好的结果。呵呵,如何将64KB的伪随机数压缩成四个字节:[种子,流长度]?:)