【问题标题】:zlib inflation corrupts when using small buffers使用小缓冲区时 zlib 膨胀会损坏
【发布时间】:2020-05-29 22:20:20
【问题描述】:

我需要用 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]),则输出正常。不用切换到这么大的缓冲区,如何解决这个问题?

【问题讨论】:

  • 在您尝试将结果附加到 str 之前,我可能会添加一个检查以查看结果是否成功。

标签: c++ c zlib


【解决方案1】:

如果 inflate() 将所有 1024 个字节写入 char 数组,那么 char 数组将没有任何 NUL 终止符字节,所以当您执行 str.append(buffer) 时,会添加到您的 @987654325 @string 将是数组中的 1024 个字符,加上数组之后的堆栈上的任何垃圾字节,直到遇到第一个 NUL 字节。

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

【讨论】:

  • 啊伙计,这是一个菜鸟的错误 :) 不管怎样,谢谢,它有效。
猜你喜欢
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多