3

我正在向我的项目添加压缩,目的是提高从 Android 应用程序到 ASP.NET C# 服务器的 3G 数据通信的速度。

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

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


Java,压缩 "Mary had a little lamb" 给出:

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

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#,压缩“玛丽有一只小羊羔”

Compressed data length: 137
Base64 Compressed String: 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();
        }
    }
4

1 回答 1

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

结果:

42
H4sIAAAAAAAEAPNNLKpUyEhMUUhUyMksKclJVchJzE0CAHrIujIWAAAA

这与 Java 数据完全相同。

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

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

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

于 2013-06-28T05:58:20.417 回答