【问题标题】:Problems decompressing a gzip archive in .NET在 .NET 中解压缩 gzip 存档时出现问题
【发布时间】:2009-03-20 05:22:24
【问题描述】:

我从 Internet 的某个地方获取了以下代码,并使用它来解压缩 gzip 文件,例如 http://wwwmaster.postgresql.org/download/mirrors-ftp/pgadmin3/release/v1.8.4/src/pgadmin3-1.8.4.tar.gz,但是当我运行它时,我得到一个异常,指出幻数不匹配。

public byte[] Download(string pUrl) {
    WebClient wc = new WebClient();
    byte[] bytes = wc.DownloadData(pUrl);
    return UnGzip(bytes, 0);
}

private static byte[] UnGzip(byte[] data, int start) {
    int size = BitConverter.ToInt32(data, data.Length - 4);
    byte[] uncompressedData = new byte[size];
    MemoryStream memStream = new MemoryStream(data, start, (data.Length - start));
    memStream.Position = 0;
    GZipStream gzStream = new GZipStream(memStream, CompressionMode.Decompress);

    try {
        gzStream.Read(uncompressedData, 0, size);
    } catch (Exception gzError) {
        throw;
    }

    gzStream.Close();
    return uncompressedData;
}

导致此问题的代码有什么问题?

【问题讨论】:

  • 能否展示获取byte[]数据数组的代码?

标签: c# .net compression gzip


【解决方案1】:

问题是您在问题中指定的 URL 实际上并没有提供 gzip 文件。它将浏览器带到您选择镜像的页面。

如果您临时更改您的 Download 方法以使用:

string text = wc.DownloadString(pUrl);
Console.WriteLine(text);

您将看到所有用于镜像选择的 HTML。

如果您使用的 URL 是 实际 gz 文件,例如http://wwwmaster.postgresql.org/redir/170/h/pgadmin3/release/v1.8.4/src/pgadmin3-1.8.4.tar.gz 然后它工作正常。

【讨论】:

    【解决方案2】:

    我无法让 GZipStream 读取您链接的文件,但它似乎可以很好地解压缩其他 GZip 文件。例如:

    ftp://gnu.mirror.iweb.com/gnu/bash/bash-1.14.0-1.14.1.diff.gz

    ftp://gnu.mirror.iweb.com/gnu/emacs/elisp-manual-21-2.8.tar.gz

    也许您链接的文件已损坏?或者它可能使用非标准或新的 GZip 格式。

    【讨论】:

      【解决方案3】:

      我使用DotNetZip 并在 .zip 文件方面取得了一些成功。根据文档,它也适用于 GZip。你可以试试这个人的图书馆。

      【讨论】:

      • DotNetZip 执行 GZIP,就像内置的 GZipStream 类一样。使用 DotNetZip 实际上不会更改 OP 提供的代码,命名空间除外。使用 DotNetZip 的主要好处是压缩更有效。减压没有优势。
      【解决方案4】:

      .NET 不支持tar 格式。 gzip 只是一个字节压缩器。 tar 是容器格式。

      ZIPRAR 等格式为您结合了这两个步骤,但它们不适合流式压缩。

      如果我没记错的话,SharpZipLib 支持 tar。

      【讨论】:

        猜你喜欢
        • 2010-10-12
        • 2012-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多