ZLib Inflate() 失败并显示 -3 Z_DATA_ERROR

2023-11-21

我试图通过调用 inflate 函数来解压缩文件,但即使我使用网站上的示例程序,它也总是失败并出现 Z_DATA_ERROR 。我想也许我的 zip 文件不受支持。我在下面附上了 zip 标题的图片。

enter image description here

这是我编写的用于执行解压缩的函数。我一次读入整个文件(大约 34KB)并将其传递给这个函数。注意:我尝试过使用 zip 标头传递整个 zip 文件,以及跳过 zip 文件标头并仅传递压缩数据,当调用 inflate() 时,两者都会失败并出现 Z_DATA_ERROR。

int CHttpDownloader::unzip(unsigned char * pDest, unsigned long * ulDestLen, unsigned char *  pSource, int iSourceLen){
    int ret = 0;
    unsigned int uiUncompressedBytes = 0; // Number of uncompressed bytes returned from inflate() function
    unsigned char * pPositionDestBuffer = pDest; // Current position in dest buffer
    unsigned char * pLastSource = &pSource[iSourceLen]; // Last position in source buffer
    z_stream strm;

    // Skip over local file header
    SLocalFileHeader * header = (SLocalFileHeader *) pSource;
    pSource += sizeof(SLocalFileHeader) + header->sFileNameLen + header->sExtraFieldLen;


    // We should now be at the beginning of the stream data
    /* allocate inflate state */
    strm.zalloc = Z_NULL;
    strm.zfree = Z_NULL;
    strm.opaque = Z_NULL;
    strm.avail_in = 0;
    strm.next_in = Z_NULL;
    ret = inflateInit2(&strm, 16+MAX_WBITS);
    if (ret != Z_OK){
        return -1;
    }

    // Uncompress the data
    strm.avail_in = header->iCompressedSize; //iSourceLen;
    strm.next_in = pSource;

    do {
        strm.avail_out = *ulDestLen;
        strm.next_out = pPositionDestBuffer;
        ret = inflate(&strm, Z_NO_FLUSH);
        assert(ret != Z_STREAM_ERROR);  /* state not clobbered */
        switch (ret) {
            case Z_NEED_DICT:
                ret = Z_DATA_ERROR;     /* and fall through */
            case Z_DATA_ERROR:
            case Z_MEM_ERROR:
                (void)inflateEnd(&strm);
                return -2;
        }
        uiUncompressedBytes = *ulDestLen - strm.avail_out;
        *ulDestLen -= uiUncompressedBytes; // ulDestSize holds number of free/empty bytes in buffer
        pPositionDestBuffer += uiUncompressedBytes;
    } while (strm.avail_out == 0);

    // Close the decompression stream
    inflateEnd(&strm);
    ASSERT(ret == Z_STREAM_END);

    return 0;
}

所以我的问题是,ZLib 的 inflate() 函数是否不支持我正在读取的 zip 文件类型?或者我的 CHttpDownloader::unzip() 函数有问题吗?谢谢你的帮助 :)


Inflate() 失败,因为它正在寻找不存在的 GZip 标头。如果您使用以下方式初始化流:

ret = inflateInit2(&strm, -MAX_WBITS);

传递负窗口位值可防止 inflate 检查 gzip 或 zlib 标头并按预期解压缩。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ZLib Inflate() 失败并显示 -3 Z_DATA_ERROR 的相关文章

随机推荐

  • HTA 的;使用其他浏览器托管?

    如果微软使用 IE 作为 HTA 本地主机的方法 那么我可以使用任何其他浏览器吗 你不能 有一个类似的 Mozilla 项目名为XUL跑者 但 HTA 仅适用于 Internet Explorer 这两种技术不兼容 为了澄清这一点 HTA可
  • Stream.Dispose 是否总是调用 Stream.Close (和 Stream.Flush)

    如果我有以下情况 StreamWriter MySW null try Stream MyStream new FileStream asdf txt MySW new StreamWriter MyStream MySW Write bl
  • 如何使用 Spark 创建用于文本分类的 TF-IDF?

    我有一个格式如下的 CSV 文件 product id1 product title1 product id2 product title2 product id3 product title3 product id4 product ti
  • -fopenmp 提供什么预处理器定义?

    我有一些可以使用 或不使用 OpenMP 运行的代码 这取决于用户如何设置 makefile 如果他们想使用 OpenMP 运行 那么他们只需添加 fopenmp to CFLAGS and CXXFLAGS 我正在尝试确定可以使用什么预处
  • 统计:Python 中的组合

    我需要在 Python 中计算组合 nCr 但找不到执行此操作的函数math numpy or stat图书馆 类似以下类型的函数 comb calculate combinations n r 我需要可能的组合数量 而不是实际的组合 所以
  • 让 gprof 根据挂钟时间进行分析?

    我的理解是 默认情况下 gprof 会考虑 CPU 时间 有没有办法让它根据挂钟时间进行分析 我的程序执行大量磁盘 I O 因此它使用的 CPU 时间仅代表实际执行时间的一小部分 我需要知道磁盘 I O 的哪些部分占用最多时间 您可以使用以
  • 如何访问 R v3 中的 Windows COM 对象?

    前段时间 您曾经可以安装rcom在 R 中打包以使用 COM 脚本 例如 访问外部程序 不幸的是 它似乎已停产 包 rcom 已从 CRAN 存储库中删除 以前可用的版本可以从存档中获取 这取决于 statconnDCOM 它现在限制使用
  • C++ 中的 RESTful 客户端 API

    是否有任何可用的开源库可以在 C 中实现 RESTful Client 用于将 HTTP 请求解释为 REST 服务调用的库 我的要求是连接到 Amazon Web Services 并获取 C 中给定用户帐户可用的 EC2 实例列表 及其
  • 在Scheme中捕获宏

    使用定义捕获宏的最简单方法是什么define syntax or define syntax rule在球拍 作为一个具体的例子 这是一个简单的例子aif在 CL 风格的宏系统中 defmacro aif test if true opti
  • Chrome - 多个请求

    每当我使用 chrome 向我的 web 应用程序发送 GET 请求时 根据我的 apache 访问日志 两个相同的请求 并非总是如此 但大多数时候 我无法重现它 它不是针对 favicon 发送到服务器 尽管 chrome 开发工具中只显
  • 如何更改 ASP.NET Core 中本地开发的默认 SSL 证书?

    在 Linux 上运行本地 ASP NET Core 应用程序时 如何将自己的证书配置为 Kestrel 使用的 默认 证书 我知道我可以运行dotnet dev certs https命令生成新的开发证书 但这将生成新的自签名证书 我不想
  • distance Between() 返回的结果不准确?

    I use distanceBetween Location 类来计算两点之间的距离 如下所示 private float getDistanceInMiles GeoPoint p1 GeoPoint p2 double lat1 dou
  • 设置列名 ddply

    如何设置汇总数据的列名 library plyr ddply data col1 col2 nrow like in ddply data col1 col2 function x data frame number nrow x 也许您正
  • 如何在控件聚焦时持续显示工具提示?

    如何在控件聚焦时持续显示工具提示 我已经尝试了很多事情 但似乎没有任何效果 现在我有类似以下内容
  • Angular - 无法按工作进行 ng-repeat order

    我已经尝试了很多 ng repeat 和 orderBy 的例子 但我无法让我的 json 与它一起工作 div div div release environment id div div div 和 JSON f
  • 获取CPU/内存利用率的跨平台方法[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 寻找一个库或相当跨平台的方法来获取 C C 中的 CPU 利用率 内存利用率等 除了 getrusage 之外 我需要整个系统 而不是一个进程 我查
  • Data Studio 中的自定义查询出现无效日期错误

    我正在尝试在 Data Studio 中使用自定义查询 BigQuery 准备图表 但是 在使用 Data Studio 日期参数时出现无效日期错误 DS START DATE and DS END DATE 这是我的查询 SELECT c
  • 访问共享网络文件夹

    我需要通过 VBA 访问网络文件服务器上托管的文件夹 该文件夹只能通过我有用户名和密码的服务帐户 与普通用户帐户不同 以书面形式访问 通过 UI 我可以看到该文件夹 并将其映射为本地驱动器 但为了以书面形式访问它 我需要从 Windows
  • “错误:选项 --single-version-externally-management 无法识别”表示什么?

    我似乎突然开始遇到错误error option single version externally managed not recognized使用时pip install与各种包 包括PyObjC and astropy 我以前从未见过这
  • ZLib Inflate() 失败并显示 -3 Z_DATA_ERROR

    我试图通过调用 inflate 函数来解压缩文件 但即使我使用网站上的示例程序 它也总是失败并出现 Z DATA ERROR 我想也许我的 zip 文件不受支持 我在下面附上了 zip 标题的图片 这是我编写的用于执行解压缩的函数 我一次读