C# 在C中用GZip压缩位数组#

C# 在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);

我有一个100M元素的比特阵列,大约是12.5M。 我必须压缩这个数组。我使用框架的GZipStream

   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的伪随机数压缩成四个字节:[种子,流长度]?:)