GZIP压缩Java/C#压缩问题的区别

Ukn*_*ght 3 c# android gzip

我正在为我的项目添加压缩,旨在提高从Android应用程序到ASP.NET C#Server的3G数据通信的速度.

我研究/编写/测试过的方法很有效.但是,压缩后会增加空白区域.它们也有所不同.这真让我困惑.

是否与Java/ASP.NET C#中的GZIP类的不同实现有关?这是我应该关注的事情,还是在解压后我继续使用.Trim()和.trim()?


Java,压缩"玛丽有一只小羊羔"给出:

压缩数据长度:42
Base64压缩字符串:H4sIAAAAAAAAAPNNLKpUyEhMUUhUyMksKclJVchJzE0CAHrIujIWAAAA

protected static byte[] GZIPCompress(byte[] data) {
    try {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        GZIPOutputStream gZIPOutputStream = new GZIPOutputStream(byteArrayOutputStream);

        gZIPOutputStream.write(data);
        gZIPOutputStream.close();

        return byteArrayOutputStream.toByteArray();
    } catch(IOException e) {
        Log.i("output", "GZIPCompress Error: " + e.getMessage());
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)


ASP.NET C#,压缩"玛丽有一只小羊羔"

压缩数据长度:137
的Base64压缩字符串:H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1 + B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee ++ 999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9 + FB8/Ir7I6ut0ns3SLC2Lti3ztMwWk/8Hesi6MhYAAAA =

    public static byte[] GZIPCompress(byte[] data)
    {
        using (MemoryStream memoryStream = new MemoryStream())
        {
            using (GZipStream gZipStream = new GZipStream(memoryStream, CompressionMode.Compress))
            {
                gZipStream.Write(data, 0, data.Length);
            }

            return memoryStream.ToArray();
        }
    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

我在.NET上也获得了42个字节.我怀疑你使用的是旧版本的.NET,它的压缩方案存在缺陷.

这是我的测试应用程序使用您的代码:

using System;
using System.IO;
using System.IO.Compression;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        var uncompressed = Encoding.UTF8.GetBytes("Mary had a little lamb");
        var compressed = GZIPCompress(uncompressed);
        Console.WriteLine(compressed.Length);
        Console.WriteLine(Convert.ToBase64String(compressed));
    }

    static byte[] GZIPCompress(byte[] data)
    {
        using (var memoryStream = new MemoryStream())
        {
            using (var gZipStream = new GZipStream(memoryStream, 
                                                   CompressionMode.Compress))
            {
                gZipStream.Write(data, 0, data.Length);
            }

            return memoryStream.ToArray();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

42
H4sIAAAAAAAEAPNNLKpUyEhMUUhUyMksKclJVchJzE0CAHrIujIWAAAA
Run Code Online (Sandbox Code Playgroud)

这与Java数据完全相同.

我正在使用.NET 4.5.我建议你尝试在你的机器上运行上面的代码,并比较结果.

我刚解压缩你提供的base64数据,它一个有效的"压缩"形式的"玛丽有一只小羊羔",在未压缩的数据中有22个字节.这让我感到惊讶......并强化了我的理论,即它是框架版本的差异.

编辑:好的,这绝对是框架版本的差异.如果我使用.NET 3.5编译器进行编译,那么使用app.config强制它与该版本的框架一起运行,我也看到了137个字节.鉴于评论,它看起来只在.NET 4.5中得到修复.