gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:05:02 26 4
gpt4 key购买 nike

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

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.

后面是断言失败。

更新

我认为这个错误是 zlib 中 compress() 函数内部转换问题的结果。如果我是正确的,错误将在 zlib 1.2.8 中 compress.c 的第 40 行返回,这是

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

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

stream.avail_in = (uInt)sourceLen;

我认为 Actor 是问题所在。 sourceLen 是一个无符号长整数,当它被转换为 uInt 位时,它会被丢弃。在我的例子中,sourceLen 是 13922075353,destLen 是 13926324460(来自 compressBound()),但是由于转换 stream.avail_out 是 1041422572。因此出现错误。

如果这是正确的,那么缓冲区的大小就有一个隐含的界限。我现在不明白的是为什么缓冲区大小是 unsigned long。它们需要是无符号整数。

最佳答案

对于这么大的东西,您需要使用 deflateInit()deflate()deflateEnd()

关于c - zlib compress() 返回 Z_BUF_ERROR 尽管缓冲区分配给 compressBound 的结果(文件太大?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27231296/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com