我需要用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)膨胀大字符串,并且我注意到,当使用较小的缓冲区时,输出已损坏(随机字母被转换为无用字符),但是当切换到较大的字符串时...
inflate()
将所有1024个字节写入char
数组,则char
数组将没有任何NUL终止符字节,因此当您执行str.append(buffer)
时,将添加到inflated
中字符串将是数组中的1024个字符,再加上数组后堆栈中碰巧出现的所有垃圾字节,直到遇到第一个NUL字节为止。