zlib inflation 在使用小缓冲区时损坏

zlib inflation corrupts when using small buffers

我需要用 zlib(大约 500 KiB)膨胀大字符串,我注意到当使用小缓冲区时输出被破坏(随机字母被转换成乱码)但是当切换到大缓冲区时输出不是已损坏。

这是我的代码:

                std::string str;
                std::lock_guard<std::mutex> lock(mutex_);

                stream_.next_in = (unsigned char*)deflated.data();
                stream_.avail_in = deflated.size();

                int result = Z_OK;

                do
                {
                    char buffer[1024] = { 0 };

                    stream_.next_out = reinterpret_cast<unsigned char*>(buffer);
                    stream_.avail_out = sizeof(buffer);

                    result = ::inflate(&stream_, Z_NO_FLUSH);

                    str.append(buffer);
                } while (result == Z_OK);

                inflated = std::move(str);

现在在 1024 时,输出已损坏,但如果我将其切换为 256 KiB(字符缓冲区 [263168]),则输出正常。如何在不切换到这么大的缓冲区的情况下解决这个问题?

如果 inflate() 将所有 1024 个字节写入 char 数组,那么 char 数组将没有任何 NUL 终止符字节,因此当您执行 str.append(buffer),添加到 inflated 字符串中的将是数组中的 1024 个字符,加上数组后堆栈中恰好出现的任何垃圾字节,直到遇到第一个 NUL 字节。

我建议设置 stream._avail_out = sizeof(buffer)-1; 以避免该问题。