尽管缓冲区分配给 compressBound 结果(文件太大?),zlib compress() 返回 Z_BUF_ERROR

2024-04-27

使用 zlib 时,我调用compress()给出一个Z_BUF_ERROR当我尝试压缩一个 13G 的文件时,尽管我认为缓冲区分配是正确的。此代码适用于较小的文件。

struct stat infile_stat;
FILE *fp = NULL;

if ((fp = fopen(md_of_name, "r")) == NULL) {
  fprintf(stderr,
          "Error: Unable to open file %s.\n",
          md_of_name);
  exit(1);
}

stat(md_of_name, &infile_stat);
size_t u_len = infile_stat.st_size;

char *u_buf = (char *)malloc(u_len);

if (u_buf == NULL) {
  fprintf(stderr, "Error: Unable to malloc enough memory for the "
                   "uncompressed buffer\n");
  exit(1);
}

if (fread(u_buf, 1, u_len, fp) < u_len) { // d
  fprintf(stderr,
          "Error: Unable to read in all of file %s. Exiting.\n ",
          md_of_name);
  exit(1);
}
fclose(fp);

size_t c_len = compressBound(u_len);

Bytef *c_buf = (Bytef *)malloc(c_len);

if (c_buf == NULL) {
  fprintf(stderr, "Error: Unable to malloc enough memory for the "
                  "compressed BIM buffer\n");
  exit(1);
}

fprintf(stderr, "u_len:%lu\tc_len:%lu\tc_buf:%p\n", u_len, c_len, c_buf);

int r = compress(c_buf, &c_len, (Bytef *)u_buf, u_len);

if (r == Z_MEM_ERROR)
  fprintf(stderr, "Not enough memory\n");
else if (r == Z_BUF_ERROR)
  fprintf(stderr, "Not enough room in the output buffer.\n");
assert(r == Z_OK);

当我在 13922075353 字节的文件上运行此命令时,输出为:

u_len:13922075353   c_len:13926324460   c_buf:0x7f2b82436010
Not enough room in the output buffer.

接下来是断言失败。

UPDATE

我相信这个错误是由于内部铸造问题造成的compress()zlib 中的函数。如果我是正确的,错误将在第 40 行返回compress.c在 zlib 1.2.8 中是

if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;

That stream.avail_out变量在上面几行设置为:

stream.avail_in = (uInt)sourceLen;

我认为演员阵容是问题所在。sourceLen是一个无符号长整型,当它被转换为uInt位被丢弃。就我而言sourceLen是13922075353,destLen是 13926324460(来自compressBound()),但是因为演员阵容stream.avail_out是 1041422572。因此出现错误。

如果这是正确的,则缓冲区的大小存在隐式限制。我现在不明白的是为什么缓冲区大小是无符号长的。它们必须是无符号整数。


对于那么大的东西,你需要使用deflateInit(), deflate(), and deflateEnd().

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

尽管缓冲区分配给 compressBound 结果(文件太大?),zlib compress() 返回 Z_BUF_ERROR 的相关文章

  • 如何使用 Qtimer 添加 1 秒延迟

    我目前有一个方法如下 void SomeMethod int a Delay for one sec timer gt start 1000 After one sec SomeOtherFunction a 这个方法实际上是一个附加到信号
  • 加权 Voronoi 的 CGAL 2D APOLLONIUS 图 - 如何生成和获取面和顶点?

    我正在尝试根据阿波罗尼乌斯图生成加权沃罗诺伊 我正在使用 CGAL 库 我找不到如何从 apollonius 获取面和顶点的好例子 我有以下类型定义 typedef double NT typedef CGAL Cartesian lt N
  • 实体框架 - 循环更新属性

    我正在尝试找到一种方法来循环 EF 对象的属性并更新这些属性的值 更具体地说 我有 50 个字段 其中最多填充 50 个下拉列表 所有 50 个可能都需要填充 也可能不需要填充 为了解决这个问题 我有一个中继器 最多可以创建 50 个 DD
  • 如何使用Task.WhenAny并实现重试

    我有一个创建多个基于 I O 的任务的解决方案 我正在使用Task WhenAny 来管理这些任务 但通常许多任务会由于网络问题或请求限制等原因而失败 我似乎找不到一个解决方案 使我能够在使用时成功重试失败的任务Task WhenAny 方
  • C# - 如何将 IntPtr 缓冲区数据保存到文件(最快的方法)?

    我使用此代码将非托管代码中的 IntPtr 缓冲区中的字节保存到文件中 这是一个简单的回调函数 private void callback IntPtr buffer int length byte bytes new byte lengt
  • 用 C++ 解密文件,该文件使用 openssl -aes-128-cbc 加密

    我正在尝试用 C 解密文件 该文件使用以下命令加密 openssl enc nosalt aes 128 cbc pass pass test in test txt out test enc txt p 控制台显示key 098F6BCD
  • 尝试将元素推入向量

    在头文件 我没有编写 中 已经定义了一个结构体 如下所示 struct MemoryMessage public boost counted base public FastAlloc explicit MemoryMessage Memo
  • 从空白启动时 VSTO 功能区不显示解决方案

    如果我从 文件 新建项目 菜单创建一个新的 Excel 2013 和 2016 VSTO 加载项 项目 然后单击 项目 添加新项目 gt 功能区 可视化设计器 则一切正常 我启动了应用程序 我的功能区显示在 Excel 中 但是 如果我首先
  • C++ 克隆惯用语中协变返回类型的用处?

    通常的克隆习惯使用协变返回类型 struct Base virtual Base clone struct Derived public Base Derived clone 我读过一些内容 大意是协变返回类型是 C 后来添加的 较旧的编译
  • 使用经度和纬度查找给定距离内的所有附近客户

    我有一个包含客户经度和纬度的数据库 我有一个搜索表单 用户将在其中输入日志 纬度 距离下拉列表包含 50 英里 100 英里 当用户单击搜索时 我想编写一个 linq 查询从数据库中获取此距离半径内的所有客户 如何使用 C 和 linq 来
  • NHibernate 中具有不同类型答案的问题

    我正在尝试找到一个问卷问题的简洁解决方案 假设我有一个Questionnaire类有一个集合Answers e g public class Questionnaire public virtual ISet
  • Boost async_write问题

    我将展示一些代码 void wh const boost system error code ec std size t bytes transferred std cout lt lt test int main int argc cha
  • 专家 C#/.Net/WPF 开发人员应该了解哪些知识? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么 MISRA:2012 需要函数原型?

    我想知道为什么 MISRA 2012 需要函数原型 在下面的示例中 这两个原型并不是真正必要的 include
  • 在 C# 中将 ulong 映射到 long ?

    我正在尝试将 ulong 映射到 long 反之亦然 将 uint 映射到 int 反之亦然 如下所示 为了将值保存在具有签名类型的 MS SQL 数据库中仅限整数和大整数 我这样做是因为我必须检查 在数据库中 一个数字 uint ulon
  • 什么是多重重继承?

    我将以下称为 多重重新继承 直接继承一个类一次 并通过继承其一个或多个后代来间接继承一次或多次 通过继承一个类的两个或多个后代来间接继承一个类两次或多次 我想知道它是否存在以及如何明确访问嵌入的子对象 1 Professional C 2n
  • lambda 表达式是多线程的吗?

    lambda 表达式是多线程的吗 假设当你将数学公式编写为 lambda 方法时 当你将其传递给另一个方法时 它会是多线程的吗 不是100 清楚你问的是什么 您是否想问 lambda 是否自然地在不同的线程上运行 如果是这样 则它们只是 S
  • jquery ajax“发布”调用

    我是 jQuery 和 Ajax 的新手 并且在 发布 方面遇到问题 我正在使用 jQuery Ajax post 调用将数据保存到数据库 当我尝试保存数据时 它将 null 传递给我的 C 方法 jQuery 看起来像这样 functio
  • 你将如何开始自动化我的工作? - 第2部分

    后续这个问题 https stackoverflow com questions 2796128 how would you start automating my job 在经历了第一波进货 9 小时的复制 粘贴 后 我现在相信我已经满足
  • C++20 范围太多 |运营商?

    我在这段代码中使用 g 10 2 有谁知道为什么我最后收到编译器错误std views reverse on results3 include

随机推荐