[zlib膨胀在使用小缓冲区时会损坏

问题描述 投票:0回答:1

我需要用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(char缓冲区[263168]),则输出很好。如何解决此问题而不必切换到这么大的缓冲区?

我需要用zlib(大约500 KiB)膨胀大字符串,并且我注意到,当使用较小的缓冲区时,输出已损坏(随机字母被转换为无用字符),但是当切换到较大的字符串时...

c++ c zlib
1个回答
0
投票
如果inflate()将所有1024个字节写入char数组,则char数组将没有任何NUL终止符字节,因此当您执行str.append(buffer)时,将添加到inflated中字符串将是数组中的1024个字符,再加上数组后堆栈中碰巧出现的所有垃圾字节,直到遇到第一个NUL字节为止。
© www.soinside.com 2019 - 2024. All rights reserved.