GZIP压缩Java/C#压缩问题的差异

GZIP压缩Java/C#压缩问题的差异,c#,android,gzip,C#,Android,Gzip,我在我的项目中增加了压缩,目的是提高从Android应用程序到ASP.NET C#Server的3G数据通信速度 我研究/编写/测试过的方法很有效。但是,压缩后会添加空白。他们也不一样。这真让我困惑 这是否与Java/ASP.NET C#中GZIP类的不同实现有关?这是我应该关心的事情,还是在解压缩后继续使用.Trim()和.Trim() Java,压缩“玛丽有一只小羊羔”给出: 压缩数据长度:42 Base64压缩字符串:H4SIAAAAAAPNNLKPUYEHMUUUYMKSKLJVCHJ

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

我研究/编写/测试过的方法很有效。但是,压缩后会添加空白。他们也不一样。这真让我困惑

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


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

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

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;
    }
}

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

压缩数据长度:137
Base64压缩字符串:H4SIAAAAAAAAEAO29B2ACSZYLJI9TYNT/SvVK1+B0OQIAYBMK2JBAEOZBIM3MKUWDAUJKASQGCPLVMZHZAZ2DVFEE++999577733ujudTif33/8/XGZKKAWZKRAYZ4HKRIHZ9+fB8/IR7I6UT0NS3LC2ZTMWK/8HESI6MHYAAA=

    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();
        }
    }

我在.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();
        }
    }
}
结果:

42
H4sIAAAAAAAEAPNNLKpUyEhMUUhUyMksKclJVchJzE0CAHrIujIWAAAA
这与Java数据完全相同

我正在使用.NET4.5。我建议您尝试在您的机器上运行上述代码,并比较结果

我刚刚解压缩了您提供的base64数据,它是“Mary had a little lamb”的有效“压缩”形式,未压缩数据中有22个字节。这让我很惊讶。。。并强化了我的理论,即它是一个框架版本的差异


编辑:好的,这肯定是框架版本的不同。如果我使用.NET3.5编译器编译,然后使用app.config强制它与该版本的框架一起运行,我也会看到137个字节。给出注释后,这似乎是在.NET 4.5中才修复的。

您的代码显示了对字节的压缩,但您已将源代码作为字符串提供-如何从字符串中获取字节?(当我使用UTF-8时,我在.NET中得到42个字节。)您使用的是.NET的哪个版本?请在此回答,以防误导。我不想在页面中添加太多的代码来分散对这个问题的注意力。我使用String.getBytes(“UTF-8”)和Encoding.UTF8.getBytes(),即使在.NET4.5中该类也有bug。改用DotNetZip。@MarkAdler谢谢你的建议,我以后再看。不过,我更愿意坚持使用本机库,只要它仍然能够很好地完成工作。感谢您的回复,我的项目使用的是Framework3.5。然后我将研究更新框架。谢谢。@Uknight:首先应该检查这是否真的是问题所在。。。我将看看是否可以强制同一个应用程序在3.5下运行,并尝试复制您的结果。@Uknight:我刚刚确认了。我在.NET3.5下也有137个字节。我在.NET4程序中运行了您的精确代码。141字节。0.o——H4SIAAAAAAAAAAOY9B2ACSZYLJI9TYNT/SvVK1+B0OQIAYBMK2JBAEOZBIM3MKUWDAUJKASQGCPLVMVDZHZAZ2DVFEE++999577733ujudTif33/8/XGZKAWZKRAYZ4KRIHZ9+fB8/IR7I6UT0NS3LC2ZTMWK/8nAAD//3rIujIWAAAA@mcmonkey4evaJon Skeet提到它在4.5中工作正常。。。访问此问题的其他人应该知道3.5和4.0在这方面存在一些小问题。